2015-08-27 47 views
0

我想弄清楚如何编写一个SQL查询返回两个其他SELECT语句的结果,每个SELECT语句都有自己的JOIN。这里是场景:单选择组合多个JOIN

表1可能在T1Number和/或T1State列中有NULL值。表2可能有具有匹配号码或状态的行。我想要Table1中的所有行,但想要在状态匹配时填入任何具有T2Number的NULL T1Number,并且在数字匹配时填充任何具有T2State的NULL T1State。我不想从表2的行不具有匹配状态或号码:

Table1:       Table2: 

Name T1Number T1State   T2Number T2State 
---- -------- -------   -------- ----- 
Joe 1   NULL   1   MA 
Bob NULL  CA    2   CA 
Dan NULL  NULL   3   FL 
Sam 4   NY    4   NY 
Ray 5   TX    8   PA 

所以我有一个SELECT语句来获取编号:

SELECT 
    Table1.Name, 
    Table1.T1Number, 
    Table1.T1State, 
    Table2.T2Number, 
    Table2.T2State 
FROM Table1 
INNER JOIN Table2 ON Table2.T2State = Table1.T1State 
WHERE (Table1.T1Number IS NULL OR Table1.T1State IS NULL) 

Result: 

Name T1Number T1State T2Number T2State 
---- -------- ------- -------- -------  
Bob NULL  CA  2   CA 

而另一个SELECT语句来获得国家:

SELECT 
    Table1.Name, 
    Table1.T1Number, 
    Table1.T1State 
    Table2.T2Number 
    Table2.T2State 
FROM Table1 
INNER JOIN Table2 ON Table2.T2Number = Table1.T1Number 
WHERE (Table1.T1Number IS NULL OR Table1.T1State IS NULL) 

Result: 

Name T1Number T1State T2Number T2State 
---- -------- ------- -------- -------  
Joe 1   NULL  1   MA 

如何编写一个组合的SELECT语句,给我以下所需的结果?

Name Number State 
---- ------ -----  
Joe 1  MA 
Bob 2  CA 
Dan NULL NULL 
Sam 4  NY 
Ray 5  TX 

我想我需要一个包含SELECT语句,做了左表1和上述查询的工会之间的连接,但我知道这是不是我做它的方式更容易。提前谢谢了。

回答

0

您可以在join操作中使用单个select语句,而不需要where子句和case语句。例如:

SELECT t1.Name 
    , CASE WHEN t1.Number is null then t2.Number else t1.Number END as Number 
    , CASE WHEN t1.State is null then t2.State else t1.State end as State 
FROM Table1 t1 
LEFT JOIN Table2 t2 
ON CASE WHEN t1.Number is null THEN t1.State 
     ELSE CONVERT(varchar(1), t1.Number) END 
    = CASE WHEN t1.Number is null THEN tab2.State 
      ELSE CONVERT(varchar(1), t2.Number) END 
+0

完美 - 这就是诀窍。谢谢你的帮助。 – MasterOfNone