2017-09-27 1 views
-2

J'essaie d'exécuter une requête dans T-SQL pour extraire un ensemble de données basé sur une colonne null.IS NULL étant ignoré

Ceci est une version simplifiée du code:

SELECT 
    T1.Col1, T1.Col2, 
    T1.Col3, T1.Col4 
FROM 
    table1 AS T1 
INNER JOIN 
    table2 AS T2 ON T1.Col2 = T2.Col3 
WHERE 
    T2.Col4 IS NULL 

Le problème est, le résultat comprend les lignes où T2.Col4 sont NULL et pas non NULL, il est comme la clause WHERE n'existe pas.

Toutes les idées seraient grandement

MISE À JOUR - version complète du code:

SELECT 

    M.ref      
    ,C.cname        
    ,CL.clname       
    ,C.ccity        
    ,M.productLine      
    ,M.code       
    ,CL.date 
    ,M.dept 
    ,DPT.group 
    ,TK2.tkname 
    ,TK2.tkdept 


FROM DB.dbo.manage AS M 

     OUTER JOIN DB.dbo.ClientManageRelationship AS CMR 
     ON CMR.RelatedEntityID = M.EntityID 

     OUTER JOIN DB.dbo.Client AS C 
     ON C.EntityID = CMR.EntityID 

     INNER JOIN DB.dbo.ManageCustomerRelationship AS MCR 
     ON MCR.EntityID = M.EntityID 

     INNER JOIN DB.dbo.Customer AS CL 
     ON CL.EntityID = MCR.RelatedID 

     INNER JOIN DB.dbo.timek AS TK 
     ON TK.tki = M.tkid 

     LEFT JOIN (SELECT Group = division, [Department] = newdesc, deptcode FROM DB.csrt.vw_rep_p_l_dept) AS DPT 
     ON tkdept = DPT.dept 

     LEFT JOIN (SELECT Name = TK2.tkfirst + ' ' + TK2.tklast, TK2.tki, TK2.dept, TK2.loc FROM DB.dbo.timek as TK2 WITH(NOLOCK)) AS TK2 
     ON TK2.tki = M.tkid 


    WHERE DPT.Department = 'Casualty' 
    AND UPPER (C.ClientName) LIKE '%LIMITED%' 
    AND CL.date > '31/12/2014' 
    AND CL.Date IS NULL 
    AND TK.tkloc = 'loc1' OR TK.tkloc = 'loc2' 

ORDER BY M.ref 
+1

Etes-vous sûr? Pouvez-vous ajouter T2.Col4 à vos données de sélection et de publication et à la sortie (au format tabulaire de texte)? – etsa

+1

Lorsque vous exécutez la requête sans l'où, obtenez-vous NULLS? –

+0

Désolé, j'aurais dû être plus clair. T2Col4 est également sélectionné pour que je puisse voir le résultat. J'ai retiré la clause where, je récupère NULLS et NOT NULLS, mais j'obtiens un ensemble de résultats plus grand sans la clause WHERE. En outre, il y a plus de jointures que dans mon exemple de code, je ne sais pas si cela fait une différence? – mark

Répondre

0

Ma première réponse serait parce que vous utilisez INNER JOIN. Cela ne renvoie que des correspondances entre les deux tables. TRY FULL OUTER JOIN qui retournera toutes les valeurs indépendamment des correspondances et inclura NULLS.

Si vous cherchez à retourner toutes les lignes sans tenir compte des correspondances, y compris NULLS provenant d'une seule des tables, utilisez RIGHT ou LEFT JOIN.

Dites que j'ai eu 2 tables ('Personne' et 'Figure'). Toutes les personnes n'ont peut-être pas entré de chiffre un jour donné. Mais un exemple peut être que je veux retourner tous les gens, qu'ils aient ou non entré un chiffre un certain jour.

Ma première approche ce serait une jointure gauche parce que je veux revenir de tout le peuple (tableau de gauche), peu importe qu'il y ait des matchs dans le tableau de la figure (tableau de droite)

FROM Person P 
    LEFT JOIN Figure F 
    ON P.ID = F.ID 

Ce serait produire un tel résultat

 Name  Figure 

     Sam  20 
     Ben  30 
     Matt  NULL 
     Simon  NULL 

considérant que,

une jointure interne produirait des valeurs correspondant à ne pas y compris les valeurs nulles

 Name  Figure 

     Sam  20 
     Ben  30 

La jointure à gauche fonctionne de la même manière que la jointure à droite, mais dans la direction opposée. C'est probablement le problème auquel vous étiez confronté. Mais j'espère que cela a aidé

+0

Merci Ryan. Cela produit le bon résultat mais je ne comprends pas le problème avec INNER JOIN. Est-ce que INNER JOIN ne devrait pas seulement montrer les résultats où il y a une correspondance dans la colonne de jointure ET une valeur NULL dans la colonne de la clause? – mark

+0

Il est difficile de dire exactement sans voir les structures de votre table mais je vais essayer d'ajouter un exemple à ma réponse qui peut aider –

+0

Je vais ajouter le code complet, plutôt qu'une petite partie de celui-ci, cela peut aider. – mark

0

Je pense que le problème est dans la dernière partie de la condition where. Vous devez utiliser des crochets.

`WHERE DPT.Department = 'Casualty' 
    AND UPPER (C.ClientName) LIKE '%LIMITED%' 
    AND CL.date > '31/12/2014' 
    AND CL.Date IS NULL 
    AND (TK.tkloc = 'loc1' OR TK.tkloc = 'loc2')` 

ou

`WHERE DPT.Department = 'Casualty' 
    AND UPPER (C.ClientName) LIKE '%LIMITED%' 
    AND CL.date > '31/12/2014' 
    AND CL.Date IS NULL 
    AND TK.tkloc IN ('loc1', 'loc2')`