2013-02-08 70 views
1

請你讓我知道如何根據條件左連接兩個不同的表?我感謝任何幫助。SQL查詢問題與案例

SELECT A.id, 
     A.flag, 
     B.fname, 
     B.lname 
FROM Table1 A 
     CASE 
      WHEN ISNULL(A.flag, 0) = 0 THEN LEFT 
     JOIN Table2 B 
      ON B.id = A.id 
       ELSE 
     LEFT JOIN Table3 B 
      ON B.id = A.id 
+0

你會需要一些動態SQL這裏。 – Kermit 2013-02-08 19:36:17

回答

0
SELECT A.id, 
     A.flag, 
     CASE 
      WHEN ISNULL(A.flag, 0) = 0 THEN B1.fname 
      ELSE B2.fname 
     END as fname, 
     CASE 
      WHEN ISNULL(A.flag, 0) = 0 THEN B1.lname 
      ELSE B2.lname 
     END as lname 
FROM Table1 A 
     LEFT JOIN Table2 B1 
      ON B1.id = A.id 
     LEFT JOIN Table3 B2 
      ON B2.id = A.id 

試試這個:

CASE 
     WHEN ISNULL(A.flag, 0) = 0 THEN B1.fname + ' ' + B1.lname 
      ELSE B2.fname + ' ' + B2.lname 
     END as name 
+0

它看起來應該這樣做。謝謝 – nav100 2013-02-08 19:52:34

+0

如何加入lname和fname? fname +''+姓名全名。當我加入fname和lname時,我遇到了模糊的列錯誤。 – nav100 2013-02-08 19:59:58

+0

@ nav100試試 – brykneval 2013-02-08 20:05:10

2

你不能。但是,你可以加入這兩個表,然後選擇您的select子句中所需的值:

SELECT A.id, A.flag, 
     (case when coalesce(A.flag, 0) = 0 then b.fname else c.fname end) as fname, 
     (case when coalesce(A.flag, 0) = 0 then B.lname else c.lname end) as lname 
FROM Table1 A left outer join 
    Table2 B 
    on B.id = A.id left outer join 
    Table3 C 
    on c.id = A.id 

這將產生額外的行是否有表2表3或者多行的任何標識。

只是作爲一個替代方案,這通常是效率較低,你也可以這樣做:

select a.id, a.flag, 
     MAX(case when coalesce(A.flag, 0) = 0 and which = 'b' or 
        coalesce(A.flag, 0) <> 0 and which = 'c' 
       then b.fname 
      end) as fname, 
     MAX(case when coalesce(A.flag, 0) = 0 and which = 'b' or 
        coalesce(A.flag, 0) <> 0 and which = 'c' 
       then b.lname 
      end) as lname 
from table1 A left outer join 
    ((select b.*, 'b' as which from table2 b) 
     union all 
     (select c.*, 'c' as which from table3 c) 
    ) b 
group by a.id, a.flag 

group by將消除不必要的重複。

+0

您還可能需要篩選出在任一聯接表中沒有關聯行的行。 OP的預期結果在這種情況下並不明確。如果需要,一個簡單的'WHERE B.fname IS NOT NULL或C.fname IS NOT NULL'應該可以工作。 – cdhowie 2013-02-08 19:42:04

+0

謝謝。 TableB是DRAFT表。 TableB和TableC列是相同的。兩個表格中都可能存在同一個人。我試圖根據FLAG返回結果。 – nav100 2013-02-08 19:46:33

0

你不能直接這樣做。但是,實際上有一種完全不直觀的方式。您可以使用不同的條件離開連接,併合並。像這樣的東西。

select a.id 
, coalesce(c.name, b.name, 'no name found') name 

from tableA a left join tableB b on a.field1 = b.field1 
left join tableC c on a.field1 = c.field2 

etc 
+0

這不起作用。看看另一個答案。 。 。條件不在第一個連接是否有效,而是基於第一個表中的一個標誌。 – 2013-02-08 19:46:24

0

由於加入該表是依賴於A.flag,你應該應用加入子句中的知識......

SELECT A.id, A.flag, 
    fname = coalesce(t2.fname, t3.fname), 
    lname = coalesce(t2.lname, t3.lname) 
FROM Table1 A 
LEFT JOIN Table2 t2 on t2.id = A.id and isnull(A.flag, 0) = 0 
LEFT JOIN Table3 t3 on t3.id = A.id and isnull(A.flag, 0) = 1