যেখানে একটি দফায় কলামের নাম উল্লেখ করা হচ্ছে


166
SELECT logcount, logUserID, maxlogtm
   , DATEDIFF(day, maxlogtm, GETDATE()) AS daysdiff
FROM statslogsummary
WHERE daysdiff > 120

আমি পাই

"অবৈধ কলামের নাম দিবস"।

ম্যাক্সলগটিম একটি তারিখের ক্ষেত্র। এটি ছোট জিনিস যা আমাকে পাগল করে তোলে।


মাইএসকিএল-এর জন্য নিশ্চিত নয়, তবে সম্ভবত উপনামটি টিক্সগুলিতে আবৃত হওয়া দরকার `daysdiff`
অ্যাশ বুড়াকাজেনকো

উত্তর:


194
SELECT
   logcount, logUserID, maxlogtm,
   DATEDIFF(day, maxlogtm, GETDATE()) AS daysdiff
FROM statslogsummary
WHERE ( DATEDIFF(day, maxlogtm, GETDATE() > 120)

সাধারণত আপনি এই দলে ফিল্ডের উপাধি উল্লেখ করতে পারবেন না WHERE। (এটিকে SELECTএলিয়াস সহ পুরো হিসাবে বিবেচনা করুন , WHEREধারাটির পরে প্রয়োগ করা হয়েছে ))

তবে, অন্যান্য উত্তরে যেমন উল্লেখ করা হয়েছে, আপনি SELECTএসকিউএলকে ক্লজটির আগে পরিচালনা করতে চিকিত্সা করতে বাধ্য করতে পারেন WHERE। যৌক্তিক ক্রিয়াকলাপটি পরিচালনা করার জন্য বা একটি সাধারণ টেবিল এক্সপ্রেশন (সিটিই) দিয়ে সাধারণত এটি প্রথম বন্ধনীর সাহায্যে করা হয়:

প্রথম বন্ধনী / Subselect:

SELECT
   *
FROM
(
   SELECT
      logcount, logUserID, maxlogtm,
      DATEDIFF(day, maxlogtm, GETDATE()) AS daysdiff
   FROM statslogsummary   
) as innerTable
WHERE daysdiff > 120

অথবা এর একটি সিটিই সংস্করণের জন্য অ্যাডামের উত্তর দেখুন।


16
এটি সরাসরি সম্ভব নয়, কারণ কালানুক্রমিকভাবে, নির্বাচনের আগে যেখানে ঘটে যায়, যা সর্বদা সম্পাদন শৃঙ্খলার সর্বশেষ পদক্ষেপ। রেফার - স্ট্যাকওভারফ্লো.
ডেভিড ব্লাইনে

আফাইক যদি নির্বাচিত উপনামটি একটি সম্পর্কিত সম্পর্কযুক্ত সাবকোয়ারি হয় তবে এটি কাজ করবে যখন সিটিই সমাধানটি করবে না।
রেজওয়ান ফ্ল্যাভিয়াস পান্ডা

যেমন পাস্কল তার উত্তরে এখানে উল্লেখ করেছেন স্ট্যাকওভারফ্লো.com/a/38822328/ 282887 , আপনি HAVING ধারাটি ব্যবহার করতে পারেন যা সাবকোয়ারির চেয়ে দ্রুত কাজ করে বলে মনে হচ্ছে।
বখতিয়র

@ বখতিওর HAVINGএমএস-এসকিউএল সহ বেশিরভাগ এসকিউএল পরিবেশে উত্তরটি কাজ করে না যা এই প্রশ্নটি নিয়ে রয়েছে। (টি-এসকিউএলএর HAVINGজন্য একটি সামগ্রিক ফাংশন প্রয়োজন))
জ্যামি এফ

72

আপনি যদি নিজের ধারাটিতে উপনামটি ব্যবহার করতে চান তবে আপনাকে WHEREএটি একটি সাব- সিলেক্টে বা মোড়কে আবদ্ধ করতে হবে :

WITH LogDateDiff AS
(
   SELECT logcount, logUserID, maxlogtm
      , DATEDIFF(day, maxlogtm, GETDATE()) AS daysdiff
   FROM statslogsummary
)
SELECT logCount, logUserId, maxlogtm, daysdiff
FROM LogDateDiff
WHERE daysdiff > 120

2
আপনি কি জানেন যে এই মেলার দক্ষতাটি কীভাবে বুদ্ধিমান? সিটিই ব্যবহার করে কি অতিরিক্ত ওভারহেড রয়েছে?
জেমস 9

5
একটি সিটিই একটি সাব-কোয়েরির জন্য কেবল প্রিটিয়ার সিনট্যাক্স, সুতরাং পারফরম্যান্সটি একই রকম হবে। আমার অভিজ্ঞতায় পারফরম্যান্স পার্থক্য এমন কিছু ছিল না যা আমাকে এই জাতীয় ক্রিয়াকলাপের জন্য উদ্বিগ্ন করেছিল, তবে আপনার পরিবেশে এটি পরীক্ষা করা মোটামুটি সহজ হওয়া উচিত যে আপনার নির্দিষ্ট সারণী / ক্যোয়ারি এই বনামটির সাথে বিরূপ প্রভাবিত হয়েছে কিনা তা দেখার জন্য should সূত্র বিশেষত যেখানে ধারা। আমি সন্দেহ করি আপনি কোনও পার্থক্য লক্ষ্য করবেন না।
অ্যাডাম ওয়েঙ্গার

আপনি একটি subquery হিসাবে ব্যবহার করার চেষ্টা না করা পর্যন্ত সিটিই দুর্দান্ত হয়। আমি তাদের বাসা বাঁধার জন্য তাদের তৈরির মত অবলম্বন করতে হয়েছিল। আমি এই একটি গুরুতর এসকিউএল ক্রটি বিবেচনা
symbiont

10

আপনার কোড পুনরায় ছাড়া এটা করতে সবচেয়ে কার্যকর উপায় ব্যবহার করে আমরা সহজেই পরিবর্তে কোথায়

SELECT logcount, logUserID, maxlogtm
   , DATEDIFF(day, maxlogtm, GETDATE()) AS daysdiff
FROM statslogsummary
HAVING daysdiff > 120

1
আমি মনে করি HAVINGএলিয়াসগুলিতে ব্যবহার করা মানসম্পন্ন নয় (যদিও এটি মাইএসকিউএলে কাজ করে)। বিশেষত, আমি মনে করি এটি এসকিউএল সার্ভারের সাথে কাজ করে না।
টোকল্যান্ড

2
এসকিউএল সার্ভার:[S0001][207] Invalid column name 'daysdiff'
ভাদজিম

3
এসকিউএল সার্ভার:[S0001][8121] Column 'day' is invalid in the HAVING clause because it is not contained in either an aggregate function or the GROUP BY clause.
ভাদজিম

9

আপনি যদি সিটিইতে আপনার সমস্ত কলামগুলি তালিকাবদ্ধ করতে না চান, তবে এটির আর একটি উপায় হ'ল outer apply:

select
    s.logcount, s.logUserID, s.maxlogtm,
    a.daysdiff
from statslogsummary as s
    outer apply (select datediff(day, s.maxlogtm, getdate()) as daysdiff) as a
where a.daysdiff > 120

6

সাবকিউরিটি কীভাবে ব্যবহার করবেন (এটি আমার জন্য মাইএসকিএলে কাজ করেছিল)?

SELECT * from (SELECT logcount, logUserID, maxlogtm
   , DATEDIFF(day, maxlogtm, GETDATE()) AS daysdiff
FROM statslogsummary) as 'your_alias'
WHERE daysdiff > 120

4

ডকুমেন্টেশন অনুযায়ী মাইএসকিউএল এ কাজ করছে:

উপস্থাপন করে আমরা সহজেই দফা এসকিউএল যুক্ত করা হয়েছে কারণ কোথায় শব্দ সমষ্টিগত ফাংশন সঙ্গে ব্যবহার করা যাবে না।


4

আপনি কলামের নামটি উল্লেখ করতে পারেন তবে আপনাকে এটি ব্যবহার করে সংজ্ঞা দিতে হবে CROSS/OUTER APPLY:

SELECT s.logcount, s.logUserID, s.maxlogtm, c.daysdiff
FROM statslogsummary s
CROSS APPLY (SELECT DATEDIFF(day, s.maxlogtm, GETDATE()) AS daysdiff) c
WHERE c.daysdiff > 120;

ডিবিফিডাল ডেমো

পেশাদাররা:

  • একক অভিব্যক্তি সংজ্ঞা (বজায় রাখা সহজ / অনুলিপি-পেস্টের প্রয়োজন নেই)
  • সিটিই / আউটকোয়ারির সাথে পুরো ক্যোয়ারি মোড়ানোর দরকার নেই
  • উল্লেখ করার সম্ভাবনা WHERE/GROUP BY/ORDER BY
  • সম্ভাব্য উন্নত পারফরম্যান্স (একক কার্যকর)

1
এটি কেবল এসকিউএল সার্ভারে কাজ করে তা উল্লেখ করার মতো মূল্য
মার্টিন জিনোভস্কি

1
@ মার্টিনজিনভস্কি প্রশ্নটি ট্যাগ করা হয়েছে sql-serverএবং এর সাথে t-sql:)
লুকাশজ সজোদা

0

এখানে এসে অনুরূপ কিছু খুঁজছেন, কিন্তু একটি মামলা যখন, এবং যেখানে এই মত ব্যবহার শেষ হয়েছে: WHERE (CASE WHEN COLUMN1=COLUMN2 THEN '1' ELSE '0' END) = 0হয়ত আপনি ব্যবহার করতে পারে DATEDIFFমধ্যে WHEREসরাসরি। কিছুটা এইরকম:

SELECT logcount, logUserID, maxlogtm
FROM statslogsummary
WHERE (DATEDIFF(day, maxlogtm, GETDATE())) > 120
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.