2017-05-10 5 views
1

私はさまざまな方法で試しましたが、これまでのところ幸運はありませんでした。SQL Server multipleが存在するすべてのテーブルに、メインテーブルのNULL条件があります。

私は表1、表2、表3及び表4が空でない場合は、この

SELECT * 
FROM MainTable 
WHERE exists (SELECT NULL FROM Table1.Column1 = MainTable.Column1 OR MainTable.Column1 is NULL) 
AND exists (SELECT NULL FROM Table2.Column2 = MainTable.Column2 OR MainTable.Column2 is NULL) 
AND exists (SELECT NULL FROM Table3.Column3 = MainTable.Column3 OR MainTable.Column3 is NULL) 
AND exists (SELECT NULL FROM Table4.Column4 = MainTable.Column4 OR MainTable.Column4 is NULL) 

ようなクエリは、これが正常に動作しています。実際の問題は、Table1、Table2、Table3、Table4のいずれかが空で、対応するManinTable列がNULLの場合に発生し、そのレコードは無視されます。 Is Nullの条件が実行されないため、レコードは存在しないとみなされます。私はIs Nullの状態が存在していなくても()同様にクエリが間違った結果を返すので、それを取ることができません。

Table1、Table2、Table3、Table4に存在するMainTableから、また対応する列がnullのレコードを取得したいとします。

編集:次は、自分でテストして実行できるサンプルデータとクエリです。私の問題を再現するには、挿入クエリをTable4にコメントアウトしてから実行してください。これで、Table4が空であり、MainTableのNullが実行されないためレコードが返されません。だから私は結果を得ることはありません。

CREATE Table #MainTable (Column1 INT NULL, Column2 INT NULL, Column3 INT NULL, Column4 INT NULL) 
CREATE Table #Table1 (Column1 INT, Column2 INT, Column3 INT, Column4 INT) 
CREATE Table #Table2 (Column1 INT, Column2 INT, Column3 INT, Column4 INT) 
CREATE Table #Table3 (Column1 INT, Column2 INT, Column3 INT, Column4 INT) 
CREATE Table #Table4 (Column1 INT, Column2 INT, Column3 INT, Column4 INT) 

INSERT INTO #MainTable VALUES(1,2,3,NULL) 
INSERT INTO #Table1 VALUES(1,2,3,4) 
INSERT INTO #Table2 VALUES(1,2,3,4) 
INSERT INTO #Table3 VALUES(1,2,3,4) 
INSERT INTO #Table4 VALUES(1,2,3,4) 

SELECT * 
FROM #MainTable 
WHERE exists (SELECT NULL FROM #Table1 WHERE Column1 = #MainTable.Column1 OR #MainTable.Column1 is NULL) 
AND exists (SELECT NULL FROM #Table2 WHERE Column2 = #MainTable.Column2 OR #MainTable.Column2 is NULL) 
AND exists (SELECT NULL FROM #Table3 WHERE Column3 = #MainTable.Column3 OR #MainTable.Column3 is NULL) 
AND exists (SELECT NULL FROM #Table4 WHERE Column4 = #MainTable.Column4 OR #MainTable.Column4 is NULL) 


Drop TABLE #MainTable 
Drop TABLE #Table1 
Drop TABLE #Table2 
Drop TABLE #Table3 
Drop TABLE #Table4 
+1

サンプルデータと予想される結果を投稿するにはどうしたらいいですか? – GuidoG

+1

"これは、Table1、tabl2、Tabl3、Table4が空でないときは正常に動作します" - 投稿したコードがどのシナリオでも機能するとは思えない。私の推測では、 "exist"の代わりに "left outer join"が必要ですが、GuidoGが投稿したサンプルデータと期待される結果は、私たちがあなたを助けるのに役立ちます:) –

+0

私は自分の答えを編集し、あなたは自分でそれを実行し、それを一瞬でテストすることができます。これは大規模なシステムの一部であり、ジョインで簡単に置き換えることはできないので、私はジョインを使用できません。 – Inayat

答えて

1

私はあなたがこのようなあなたのクエリを変更するには持っているよりも、あなたが望むものを修正理解していれば:

SELECT * 
FROM #MainTable 
WHERE (Column1 is null or exists (SELECT NULL FROM #Table1 WHERE Column1 = #MainTable.Column1)) 
AND (Column2 is null or exists (SELECT NULL FROM #Table2 WHERE Column2 = #MainTable.Column2)) 
AND (Column3 is null or exists (SELECT NULL FROM #Table3 WHERE Column3 = #MainTable.Column3)) 
AND (Column4 is null or exists (SELECT NULL FROM #Table4 WHERE Column4 = #MainTable.Column4)) 

元のクエリに問題がmaintable.Column4はそれがあったnullのとき、つまりあります

WHERE Column4 = NULL 
に翻訳され

WHERE Column4 = #MainTable.Column4 

をやって210

あなたはnull値で=を行うことはできません

+0

ありがとう、それは働いた。 – Inayat

関連する問題