SQL 服务器 multiple Exists where every exists has a NULL condition of main table

SQL Server multiple Exists where every exists has a NULL condition of main table

我尝试了不同的方法并在网上进行了搜索,但到目前为止没有成功。

我有这样的查询

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 不为空时,这可以正常工作。当 Table1、Table2、Table3 和 Table4 中的任何一个为空并且其对应的 ManinTable 列为 NULL 时,真正的问题就会出现,然后该记录将被忽略。该记录被视为不存在,因为 Is Null 条件将不会执行。我什至不能从 exists () 中取出 Is Null 条件,因为这样查询将 return 错误的结果。

我想从存在于 Table1、Table2、Table3 和 Table4 中的 MainTable 中获取记录,并且如果对应的列为空。

编辑:以下是示例数据和查询,您可以自行测试和执行。要重现我的问题,只需将插入查询注释掉到 Table4 中,然后执行,现在它不会 return 任何记录,因为 Table4 是空的,因此 Is Null for MainTable 将不会执行。所以我不会得到结果。

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

如果我理解正确你想要什么,那么你必须像这样更改你的查询:

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 = #MainTable.Column4 

翻译成

WHERE Column4 = NULL

并且您不能对空值执行 =