1

次のクエリを実行しようとしましたが、1行を取得する必要がありますが、データを取得できません:

select * from [DB1.table1] where col1 not in (select col2 from DB2.table2) 

col1、col2 は varchar 型です

なぜ機能しないのですか?

4

3 に答える 3

5

動作しません」は問題の正確な説明ではありませんが、ほとんどの場合、サブセレクトが 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」ではないため、クエリ全体で何も返されません。

于 2013-03-28T07:43:27.760 に答える
1

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 INUNKNOWN一度NULL比較されるためです。

次の方法で修正できます。

select * from table1 where col1 not in (select col2 from table2 where col2 is not null)

それがあなたの状況の正しい論理である場合。

于 2013-03-28T07:44:57.607 に答える
1

他の人がこの問題を引き起こす理由をすでに指摘しているように、次の値を使用しLEFT JOINた述語よりも安全で、同じ結果を得ることができます。INNULL

select t1.* 
from [DB1.table1] AS T1 
LEFT JOIN  DB2.table2 AS t2 ON t1.col1 = t2.col2
where t1.col2 IS NULL;
于 2013-03-28T07:46:54.397 に答える