SQL ليس في جملة
-
25-09-2019 - |
سؤال
لدي استعلام لا يعمل كما هو متوقع
Q1:
SELECT id, name
FROM vw_x
WHERE id NOT IN (select pid from table_x)
GROUP BY id, name
Having max(c_date) > GETDATE()
Q2:
SELECT id, name
FROM vw_x
GROUP BY id, name
Having max(c_date) > GETDATE()
Q1 لا يعيد أي شيء على الرغم من أنني أعلم أن هذه المعرفات ليست في Table_X Q2 تعمل بشكل صحيح دون عدم وجودها
ما الذي يمكن أن يكون خطأ في استفساري؟
المحلول
لديك قيمة فارغة في الجدول
جرب هذا
SELECT id, name
FROM vw_x
WHERE id NOT IN (select pid from table_x where pid is not null)
GROUP BY id, name
Having max(c_date) > GETDATE()
أو هذا
SELECT id, name
FROM vw_x
WHERE NOT EXISTS (select 1 from table_x where pid = vw_x.id )
GROUP BY id, name
Having max(c_date) > GETDATE()
أنظر أيضا حدد جميع الصفوف من جدول واحد غير موجود في جدول آخر
نصائح أخرى
ماذا عن استخدام انضمام يسار؟
SELECT id, name
FROM vw_x
LEFT JOIN table_x on id = pid
WHERE pid IS NULL
GROUP BY id, name
Having max(c_date) > GETDATE()
هناك موقف آخر: قد لا تعيد الاستماع الفرعي شيئًا. لا يعمل SQL Server كما هو متوقع إذا قام NOT in Cind بإرجاع قائمة فارغة. لدي استعلام مثل ما يلي:
select * from table where id not in (select id from tableB where somecondition(x))
عندما يحتوي الاسم الفرعي على قائمة معرفات ، سيقوم الاستعلام بإرجاع البيانات كما هو متوقع. ولكن عندما لا يعيد الاسم الفرعي شيئًا ، سيظل الاستعلام يرجع البيانات ، ولكن بعد ذلك يصبح عالقًا.
لقد غيرت الاستعلام إلى ما يلي وحل المشكلة:
select * from table where id not in (select id from tableB where somecondition(x) **union all select 0**)
مما يتأكد من أن الاستماع الفرعي سيحتوي على رقم واحد على الأقل.