次のクエリを実行しようとしましたが、1行を取得する必要がありますが、データを取得できません:
select * from [DB1.table1] where col1 not in (select col2 from DB2.table2)
col1、col2 は varchar 型です
なぜ機能しないのですか?
次のクエリを実行しようとしましたが、1行を取得する必要がありますが、データを取得できません:
select * from [DB1.table1] where col1 not in (select col2 from DB2.table2)
col1、col2 は varchar 型です
なぜ機能しないのですか?
「動作しません」は問題の正確な説明ではありませんが、ほとんどの場合、サブセレクトが NULL 値を返すことが原因です。
おそらくこれが必要です:
select * from [DB1.table1]
where col1 not in (select col2 from DB2.table2 where col2 is not null);
との比較ではNULL
常に「未定義」が生成されるため、副選択の少なくとも 1 つの行NULL
の列に a が含まれている場合col2
、式全体が「未定義」になります。undefined は「true」ではないため、クエリ全体で何も返されません。
NULL
にs がcol2
ある場合table2
は、説明した動作が得られます。
create table table2 (
col2 varchar(10) null
)
insert into table2 (col2) values ('abc'),(null)
create table table1 (
col1 varchar(10) null
)
insert into table1 (col1) values ('abc'),('def')
select * from table1 where col1 not in (select col2 from table2)
行を生成しません。これは、benches の結果NOT IN
がUNKNOWN
一度NULL
比較されるためです。
次の方法で修正できます。
select * from table1 where col1 not in (select col2 from table2 where col2 is not null)
それがあなたの状況の正しい論理である場合。
他の人がこの問題を引き起こす理由をすでに指摘しているように、次の値を使用しLEFT JOIN
た述語よりも安全で、同じ結果を得ることができます。IN
NULL
select t1.*
from [DB1.table1] AS T1
LEFT JOIN DB2.table2 AS t2 ON t1.col1 = t2.col2
where t1.col2 IS NULL;