কেন একটি subquery মধ্যে COALESCE নীল ফেরত?


15

এই স্কিমা দেওয়া:

CREATE TABLE #TEST_COALESCE
(
    Id int NOT NULL,
    DateTest datetime NOT NULL,
    PRIMARY KEY (Id, DateTest)
);

INSERT INTO #TEST_COALESCE VALUES
(1, '20170201'),
(1, '20170202'),
(1, '20170203'),
(2, '20170204'),
(2, '20170205'),
(2, '20170206');

যদি আমি একটি subquery মধ্যে COALESCE ব্যবহার করি, এটি NULL প্রদান করে।

SELECT  t1.Id, t1.DateTest,
        (SELECT TOP 1 COALESCE(t2.DateTest, t1.DateTest)
         FROM         #TEST_COALESCE t2
         WHERE        t2.Id = t1.Id
         AND          t2.DateTest > t1.DateTest
         ORDER BY     t2.Id, t2.DateTest) NextDate
FROM    #TEST_COALESCE t1;

+----+---------------------+---------------------+
| Id | DateTest            | NextDate            |
+----+---------------------+---------------------+
| 1  | 01.02.2017 00:00:00 | 02.02.2017 00:00:00 |
| 1  | 02.02.2017 00:00:00 | 03.02.2017 00:00:00 |
| 1  | 03.02.2017 00:00:00 | NULL                |
| 2  | 04.02.2017 00:00:00 | 05.02.2017 00:00:00 |
| 2  | 05.02.2017 00:00:00 | 06.02.2017 00:00:00 |
| 2  | 06.02.2017 00:00:00 | NULL                |
+----+---------------------+---------------------+

তবে, যদি এটি সাবকোয়ারির বাইরে রাখা হয়:

SELECT  t1.Id, t1.DateTest,
        COALESCE((SELECT TOP 1 t2.DateTest
                 FROM         #TEST_COALESCE t2
                 WHERE        t2.Id = t1.Id
                 AND          t2.DateTest > t1.DateTest
                 ORDER BY     t2.Id, t2.DateTest), t1.DateTest) NextDate
FROM    #TEST_COALESCE t1;

+----+---------------------+---------------------+
| Id | DateTest            | NextDate            |
+----+---------------------+---------------------+
| 1  | 01.02.2017 00:00:00 | 02.02.2017 00:00:00 |
| 1  | 02.02.2017 00:00:00 | 03.02.2017 00:00:00 |
| 1  | 03.02.2017 00:00:00 | 03.02.2017 00:00:00 |
| 2  | 04.02.2017 00:00:00 | 05.02.2017 00:00:00 |
| 2  | 05.02.2017 00:00:00 | 06.02.2017 00:00:00 |
| 2  | 06.02.2017 00:00:00 | 06.02.2017 00:00:00 |
+----+---------------------+---------------------+

কেন প্রথম subquery ফেরত দেয় না: t1.DateTest?

http://rextester.com/CNDOO40877


3
উপায় দ্বারা একটি ডেমো টেবিল এবং একটি রেপো কোয়েরি ব্যবহারের দুর্দান্ত। আমি কোনও উত্তর পোস্ট করতে যাচ্ছিলাম না, তবে আমি গিয়েছিলাম, "তিনি এই সমস্ত কাজকে প্রশ্নের মধ্যে ফেলেছিলেন, হাহাহাহাহা, আমি কমপক্ষে কোনও কাজই একটি জবাবের মধ্যে রেখেছি।"
ব্রেন্ট ওজার

হাই @ ব্রেন্ট ওজার, আপনার বিস্তারিত উত্তরের জন্য ধন্যবাদ, এটি স্ফটিক পরিষ্কার।
ম্যাকনেটস 23:58

উত্তর:


16

নির্বাচনের জিনিসগুলি কেবলমাত্র FROM বিবৃতিতে সারিগুলি উপস্থিত থাকলে ফিরে আসে।

প্রথমে আসুন এটি ধারণাগতভাবে চিন্তা করি।

প্রশ্ন 1 এর মতো:

"আপনার গ্যারেজে সমস্ত ফেরারিগুলি সন্ধান করুন each

কোয়েরিটি কোনও সারি ছাড়াই ফিরে আসবে - কারণ গ্যারেজে ফেরারি ছিল না। (কমপক্ষে, আমার নিজের গ্যারেজে কোনও সারি পাওয়া যায় নি))

প্রশ্ন 2 পৃথক:

"গ্যারেজে যান I

এজন্যই কোলেসেসটি অনুসন্ধানের অপারেশনের বাইরে থাকতে হবে: ফলাফলের সেটে কোনও সারি না থাকলেও আপনার এটি হওয়া দরকার।

এখন, আপনার জিজ্ঞাসা তাকান।

আমি সাবকিউরিটি নিজেই বাইরে নিয়ে যাচ্ছি এবং আমি যে সারিটিতে কাজ করতে চাইছে এমন একটি সারির জন্য হার্ড-কোড মানগুলিতে যাচ্ছি, তবে এটি করতে পারে না:

SELECT TOP 1 COALESCE(t2.DateTest, 'NO FERRARIS FOUND')
     FROM         #TEST_COALESCE t2
     WHERE        t2.Id = 1
     AND          t2.DateTest > '2017-02-03 00:00:00.000'
     ORDER BY     t2.Id, t2.DateTest

WHERE ধারাতে আমি আইডি = 1 এবং তারিখ টেস্ট> '2017-02-03 00: 00: 00.000' হার্ড-কোডড করেছি। যখন এই কোয়েরিটি চলে, তখন এটি কোনও ফলাফল দেয় না:

কোনও ফেরারি পাওয়া যায় নি

এই কারণেই COALESCE কাজ করে না: এই ফলাফলের সেটটিতে কোনও সারি নেই এবং আপনার গ্যারেজে কোনও ফেরারি নেই। এই ধারণাটি আয়ত্ত করুন এবং আপনার মধ্যে ফেরারি থাকবে ... এক মিনিট অপেক্ষা করুন ... আমি সেই ধারণাটি আয়ত্ত করেছি এবং আমার গ্যারেজে কোনও ফেরারি নেই ...


3
হাহাহাহা, মনোযোগ দিয়ে দেখুন, আপনি কি নিশ্চিত যে সেখানে কোনও 360 মোডেনা নেই?
ম্যাকনেটস

3
@ এমসিএনলেটগুলি কেবল নিরাপদ থাকতে আমার আবার চেক করা উচিত।
ব্রেন্ট ওজার
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.