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
并且您不能对空值执行 =
我尝试了不同的方法并在网上进行了搜索,但到目前为止没有成功。
我有这样的查询
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
并且您不能对空值执行 =