SQL左外连接2个表,每列有2列和不同的条件

时间:2018-06-12 03:29:46

标签: sql sql-server

我有一个数据表“DT”和一个映射表“MT”如下:

DT表:

ComID - CountryCode
-------------------
1000    US
1001    US
1111    FR
1222    CN
1234    CN
1333    CN

MT表:

CountryCode - Region Name - ComID
----------------------------------
   US        North America   
   US            America    1001
   FR            Europe
   CN            CHINA      
   CN            ASIA       1222 
   CN            ASEAN      1333

我有一个视图,其中包含这两个表以及其他映射表(数据表 LEFT OUTER JOIN与其他映射表

我想要的是根据国家/地区代码链接两个表格,对于一些我想使用ComID的特殊公司。

我尝试了很少的查询但是每个查询似乎都没有提供解决方案。 以下是我实现这一目标的尝试:

    Select DT.*, MT.., ...    
    FROM   DT LEFT OUTER JOIN
           MT ON DT.CountryCode = MT.CountryCode AND DT .CC_COMPANY_CODE NOT IN ('1001', '1222', '1333') OR
    DT.ComID = MTComID AND DT.ComID IN ('1001', '1222', '1333')
    LEFT OUTER JOIN ... other tables ... LEFT OUTER JOIN ... other tables ...

前一个将返回两个条件适用的行:

  

CN - CHINA - 1234
    CN - ASIA - 1222
    CN - ASEAN - 1333

我尝试了类似这样的东西,但它会返回一个语法错误,解决方案应该是这个,但我似乎无法找到它。

Select DT.*, MT.., ...    
        FROM   DT LEFT OUTER JOIN
               MT ON DT.CountryCode = MT.CountryCode WHERE (DT .CC_COMPANY_CODE NOT IN ('1001', '1222', '1333')) OR
        ON DT.ComID = MTComID WHERE (DT.ComID IN ('1001', '1222', '1333'))
        LEFT OUTER JOIN ... other tables ...

1 个答案:

答案 0 :(得分:2)

这是一种方法。

SELECT DT.CompID,DT.CountryCode,MT.RegionName
    FROM DT 
    JOIN MT 
        ON MT.CompID IS NOT NULL AND MT.CompID = DT.CompID
UNION
SELECT DT.CompID,DT.CountryCode,MT.RegionName
    FROM DT 
    JOIN MT 
        ON MT.CompID IS NULL AND MT.CountryCode = DT.CountryCode
        WHERE NOT EXISTS (SELECT TOP 1 1 FROM MT WHERE CompID = DT.CompID)

SQLFidder

尽量不要将CompID硬编码为逻辑的一部分,因为它不会成为未来的证据。