এটি এখানে উত্তরগুলি থেকে শেষ করা যেতে পারে যা NOT IN (subquery)
নালগুলি সঠিকভাবে পরিচালনা করে না এবং এর পক্ষে এড়ানো উচিত NOT EXISTS
। তবে এ জাতীয় সিদ্ধান্ত অকাল হতে পারে। নিম্নলিখিত দৃশ্যে, ক্রিস ডেটকে জমা দেওয়া (ডাটাবেস প্রোগ্রামিং এবং ডিজাইন, খণ্ড ২ নং 9, সেপ্টেম্বর 1989), এটি হ'ল NOT IN
নালগুলি সঠিকভাবে পরিচালনা করে এবং সঠিক ফলাফলটি দেয়, পরিবর্তেNOT EXISTS
।
sp
সরবরাহকারীদের প্রতিনিধিত্ব করতে একটি টেবিল বিবেচনা করুন ( sno
) যারা pno
পরিমান ( qty
) পরিমাণে সরবরাহ করার জন্য পরিচিত known টেবিলটি বর্তমানে নিম্নলিখিত মানগুলি ধারণ করে:
VALUES ('S1', 'P1', NULL),
('S2', 'P1', 200),
('S3', 'P1', 1000)
নোট করুন যে পরিমাণটি হ'ল অযোগ্য, অর্থাৎ কোনও সরবরাহকারী কোন পরিমাণে না জানা থাকলেও অংশ সরবরাহ করার জন্য পরিচিত তা রেকর্ড করতে সক্ষম হতে।
কাজটি হ'ল সরবরাহকারী যারা সরবরাহের পার্ট নম্বর 'পি 1' হিসাবে পরিচিত তবে 1000 এর পরিমাণে নয় বলে সন্ধান করা।
NOT IN
সরবরাহকারী 'এস 2' কেবলমাত্র সঠিকভাবে সনাক্ত করতে নিম্নলিখিত ব্যবহারগুলি :
WITH sp AS
( SELECT *
FROM ( VALUES ( 'S1', 'P1', NULL ),
( 'S2', 'P1', 200 ),
( 'S3', 'P1', 1000 ) )
AS T ( sno, pno, qty )
)
SELECT DISTINCT spx.sno
FROM sp spx
WHERE spx.pno = 'P1'
AND 1000 NOT IN (
SELECT spy.qty
FROM sp spy
WHERE spy.sno = spx.sno
AND spy.pno = 'P1'
);
তবে নীচের ক্যোয়ারিতে একই সাধারণ কাঠামো ব্যবহার করা হয়েছে তবে এর সাথে NOT EXISTS
তবে ভুলভাবে সরবরাহকারী 'এস 1' অন্তর্ভুক্ত রয়েছে ফলাফলের জন্য (অর্থাত্ পরিমাণটি নাল):
WITH sp AS
( SELECT *
FROM ( VALUES ( 'S1', 'P1', NULL ),
( 'S2', 'P1', 200 ),
( 'S3', 'P1', 1000 ) )
AS T ( sno, pno, qty )
)
SELECT DISTINCT spx.sno
FROM sp spx
WHERE spx.pno = 'P1'
AND NOT EXISTS (
SELECT *
FROM sp spy
WHERE spy.sno = spx.sno
AND spy.pno = 'P1'
AND spy.qty = 1000
);
সুতরাং NOT EXISTS
কবচ এটা হাজির হতে পারে না!
অবশ্যই, সমস্যার উত্স হ'ল নালগুলির উপস্থিতি, সুতরাং 'আসল' সমাধানটি সেই নালগুলি দূর করা।
এটি দুটি সারণী ব্যবহার করে (অন্যান্য সম্ভাব্য নকশাগুলির মধ্যে) অর্জন করা যেতে পারে:
sp
সরবরাহকারী অংশ সরবরাহ হিসাবে পরিচিত
spq
সরবরাহকারীরা জ্ঞাত পরিমাণে অংশ সরবরাহ করতে পরিচিত
উল্লেখ করে সেখানে সম্ভবত একটি বিদেশী কী বাধা থাকতে হবে যেখানে spq
রেফারেন্স sp
।
এরপরে ফলাফলটি 'বিয়োগ' রিলেশনাল অপারেটর ( EXCEPT
স্ট্যান্ডার্ড এসকিউএল-এর মূলশব্দ হওয়া) ব্যবহার করে প্রাপ্ত করা যেতে পারে
WITH sp AS
( SELECT *
FROM ( VALUES ( 'S1', 'P1' ),
( 'S2', 'P1' ),
( 'S3', 'P1' ) )
AS T ( sno, pno )
),
spq AS
( SELECT *
FROM ( VALUES ( 'S2', 'P1', 200 ),
( 'S3', 'P1', 1000 ) )
AS T ( sno, pno, qty )
)
SELECT sno
FROM spq
WHERE pno = 'P1'
EXCEPT
SELECT sno
FROM spq
WHERE pno = 'P1'
AND qty = 1000;
NOT IN
ধারাবাহিক<> and
আচরণকে একটি সিরিজে রূপান্তর করে অন্য কিছুতে রূপান্তর করা ?