在两个表之间找到匹配时返回空结果集

时间:2016-01-25 22:43:33

标签: sql-server join

我正在进行SQL连接查询,如下所示

SELECT DISTINCT GL2.Number1, GL.DEPARTMENT,GL.CLASS,GL.SUBCLASS,GL.LINE, PR.*
        FROM DETAIL A

        LEFT JOIN CATEGORIES CAT ON   A.WEB_ID=CAT.CATEGORY_ID  
        LEFT JOIN GROUP_LINES GL ON 
                                                A.BRAND=GL.MANUFACTURER 
                                                OR  A.A1=GL.Number1 
                                                OR  CAT.A2 =  GL.DEPARTMENT
                                                OR  CAT.A3=  GL.CLASS
                                                OR  CAT.A4= GL.SUBCLASS
                                                OR  CAT.A5= GL.LINE


        LEFT JOIN  RULE_GROUPS RG ON GL.GROUP_ID=RG.GROUP_ID
        LEFT JOIN  RULE_GROUPS RG2 ON RG.RULE_ID=RG2.RULE_ID                                            
        LEFT JOIN  GROUP_LINES GL2 ON RG2.GROUP_ID=GL2.GROUP_ID
        LEFT JOIN  PRICING_RULES PR ON RG.RULE_ID=PR.RULE_ID
        LEFT JOIN  PRICING_ATTRIBUTES PA ON PR.RULE_ID=PA.RULE_ID

    WHERE A.INVEN_ID='123456'

现在我有另一个名为Exclusions(表示Ex)的表,其中包含字段BRAND,Number1,DEPARTMENT,CATEGORY_ID以及上述查询中的列但我想检查此表并且只有在以下情况下才会返回记录条件都是真的

Ex.BRAND!=A.BRAND AND
EX.NEMBER1!=A.SEGMENT1 AND
EX.DEPARTMENT!=GL.DEPARTMENT AND
EX.CATEGORY_ID!=A.WEB_ID  

我可以知道解决方法吗?

1 个答案:

答案 0 :(得分:2)

如果要在所有列匹配时排除它:

SELECT DISTINCT GL2.Number1, GL.DEPARTMENT,GL.CLASS,GL.SUBCLASS,GL.LINE, PR.*
        FROM DETAIL A

        LEFT JOIN CATEGORIES CAT ON   A.WEB_ID=CAT.CATEGORY_ID  
        LEFT JOIN GROUP_LINES GL ON 
                                                A.BRAND=GL.MANUFACTURER 
                                                OR  A.A1=GL.Number1 
                                                OR  CAT.A2 =  GL.DEPARTMENT
                                                OR  CAT.A3=  GL.CLASS
                                                OR  CAT.A4= GL.SUBCLASS
                                                OR  CAT.A5= GL.LINE


        LEFT JOIN  RULE_GROUPS RG ON GL.GROUP_ID=RG.GROUP_ID
        LEFT JOIN  RULE_GROUPS RG2 ON RG.RULE_ID=RG2.RULE_ID                                            
        LEFT JOIN  GROUP_LINES GL2 ON RG2.GROUP_ID=GL2.GROUP_ID
        LEFT JOIN  PRICING_RULES PR ON RG.RULE_ID=PR.RULE_ID
        LEFT JOIN  PRICING_ATTRIBUTES PA ON PR.RULE_ID=PA.RULE_ID

    WHERE A.INVEN_ID='123456'
AND NOT EXISTS
(
SELECT *
FROM
Exclusions Ex
WHERE
Ex.BRAND = A.BRAND AND
EX.NEMBER1 = A.SEGMENT1 AND
EX.DEPARTMENT = GL.DEPARTMENT AND
EX.CATEGORY_ID = A.WEB_ID 
);

或者,如果您想要在任何列匹配

时将其排除
SELECT DISTINCT GL2.Number1, GL.DEPARTMENT,GL.CLASS,GL.SUBCLASS,GL.LINE, PR.*
        FROM DETAIL A

        LEFT JOIN CATEGORIES CAT ON   A.WEB_ID=CAT.CATEGORY_ID  
        LEFT JOIN GROUP_LINES GL ON 
                                                A.BRAND=GL.MANUFACTURER 
                                                OR  A.A1=GL.Number1 
                                                OR  CAT.A2 =  GL.DEPARTMENT
                                                OR  CAT.A3=  GL.CLASS
                                                OR  CAT.A4= GL.SUBCLASS
                                                OR  CAT.A5= GL.LINE


        LEFT JOIN  RULE_GROUPS RG ON GL.GROUP_ID=RG.GROUP_ID
        LEFT JOIN  RULE_GROUPS RG2 ON RG.RULE_ID=RG2.RULE_ID                                            
        LEFT JOIN  GROUP_LINES GL2 ON RG2.GROUP_ID=GL2.GROUP_ID
        LEFT JOIN  PRICING_RULES PR ON RG.RULE_ID=PR.RULE_ID
        LEFT JOIN  PRICING_ATTRIBUTES PA ON PR.RULE_ID=PA.RULE_ID

    WHERE A.INVEN_ID='123456'
AND NOT EXISTS
(
SELECT *
FROM
Exclusions Ex
WHERE
Ex.BRAND = A.BRAND OR
EX.NEMBER1 = A.SEGMENT1 OR
EX.DEPARTMENT = GL.DEPARTMENT OR
EX.CATEGORY_ID = A.WEB_ID 
);