سؤال

لدي استعلام لا يعمل كما هو متوقع

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**)

مما يتأكد من أن الاستماع الفرعي سيحتوي على رقم واحد على الأقل.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top