SQL Server multiple existe où chaque existe a une condition NULL de la table principale

J'ai essayé différentes manières et j'ai cherché sur le web, mais pas de chance jusqu'à présent.

J'ai une requête comme celle-ci

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) 

Cela fonctionne correctement lorsque Table1, Table2, Table3 et Table4 ne sont pas vides. Le vrai problème se pose lorsque l'une des Table1, Table2, Table3 et Table4 est vide et que sa colonne ManinTable correspondante est NULL, alors cet logging est ignoré. L'logging est considéré comme inexistant car la condition Is Null ne s'exécutera pas. Je ne peux même pas prendre la condition Is Null de exists () car la requête returnnera un mauvais résultat.

Je veux get des loggings de MainTable qui existe dans Table1, Table2, Table3 et Table4 et aussi si la colonne correspondante est null.

Edit: voici les exemples de données et de requêtes que vous pouvez tester et exécuter par vous-même. Pour reproduire mon problème il suffit de commenter la requête d'insertion dans Table4 et ensuite d'exécuter, maintenant il ne returnnera aucun logging parce que Table4 est vide d'où Is Null for MainTable ne s'exécutera pas. Donc je n'obtiendrai aucun résultat.

 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 

Si je comprends bien ce que vous voulez, alors vous devez changer votre requête comme ceci:

 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)) 

Le problème avec la requête d'origine est que lorsque maintable.Column4 est null, il faisait

 WHERE Column4 = #MainTable.Column4 

qui est traduit en

 WHERE Column4 = NULL 

et vous ne pouvez pas faire = sur une valeur nulle