3

期待どおりに動作しないクエリがあります

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

それらの ID が table_x にないことを知っていても、Q1 は何も返さない Q2 は NOT IN なしで正しく実行される

クエリの何が問題になっている可能性がありますか?

4

3 に答える 3

19

テーブルに NULL 値があります

これを試して

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

別のテーブルに存在しない 1 つのテーブルからすべての行を選択するも参照してください。

于 2010-02-02T21:18:05.510 に答える
2

左結合を使用するのはどうですか?

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()
于 2010-02-02T21:25:46.747 に答える
0

サブクエリが何も返さない場合もあります。NOT IN 句が null リストを返す場合、SQL Server は期待どおりに動作しません。次のようなクエリがあります。

select * from table where id not in (select id from tableB where somecondition(x))

サブクエリに ID のリストが含まれている場合、クエリは期待どおりにデータを返します。ただし、サブクエリが何も返さない場合、クエリは引き続きデータを返しますが、スタックします。

クエリを次のように変更し、問題を解決しました。

select * from table where id not in (select id from tableB where somecondition(x) **union all select 0**)

これにより、サブクエリに少なくとも 1 つの数値が含まれるようになります。

于 2015-04-28T18:06:00.577 に答える