2

私は本当に私を混乱させている問題を抱えています。あなたの誰かが、私が見落としている本当にばかげた間違いを指摘することを半分期待していますが、実際にはそれを見ていません.

私たちの生産プロセスが約 1 年間供給しているテーブルがあり、データを照合しようとしているクライアントからクレイジーなテーブルを入手しました。次のクエリでは、tableAは my テーブルで、tableBはインポートしたばかりのテーブルです。

基本的な問題は、

select *
from tableA
where convert(nvarchar(30),accountNum) not in (
        select CisAC
        from tableB
    )

私がそうすべきだと思うのに、レコードを返していません。accountNum が tableB の CisAC フィールドと一致する tableA のレコードを見つける必要があると思います。右?CisAC は nvarchar(30) で、accountNum フィールドは bigint です。

空の戻り値セットが間違っていると思う理由を指摘するには:

select * from tableA where convert(nvarchar(30),accountNum) = '336906210032'

1 つのレコードを返しますが、

select * from tableB where CisAC = '336906210032'

ではない。

それで、何が得られますか?(そして、お時間をいただきありがとうございます!)

4

3 に答える 3

3

私の疑いは、tableBのnull値であり、IN失敗する原因になります

私は試してみます

select * 
from tableA 
     left join tableB
     on convert(nvarchar(30),tableA.accountNum) = tableB.CisAC 
where tableB.CisAc is null
于 2012-10-04T15:33:10.270 に答える
3

あなたの質問は正しいです。期待通りの結果を返しています。

SQL Fiddle については、こちらを参照してください: http://sqlfiddle.com/#!6/dfb5d/1

おそらく起こっていることは、あなたが持っているデータが のデータとtableB一致していないということですtableA.

編集:

@Andomar が答えたようtableBに、値が null の場合、クエリは失敗します。ここを参照してください:

http://sqlfiddle.com/#!6/05bb1/1

于 2012-10-04T15:33:46.297 に答える
2

これはおそらく古典的なnot in間違いです。テーブル B にnull値が含まれている場合、

where convert(nvarchar(30),accountNum) not in (
        select CisAC
        from tableB
    )

決して成功しません。次のように書き出すことができます。

where convert(nvarchar(30),accountNum) <> null and convert(nvarchar(30),accountNum) <> ...

との比較は とnull評価されるためunknown、この条件が真になることはありません。

クエリをjoinpodiluskaの答えのようなものに置き換えると、うまくいくはずです。

于 2012-10-04T15:42:56.513 に答える