2015-08-27 50 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