2016-11-15 72 views
0

我需要一個SQL查詢來處理複雜的SELECT。假設如下表:SQL查詢從3個選項中選擇,並根據列值從其他表中選擇

 
Table 1:        Table 2: 
name | email  | callingcardid  id | name | email 
-------|------------|--------------  ---|--------|---------------- 
first | [email protected] | null    1 | second | [email protected] 
second |   | 1 
third |   | null 

輸出應該是:

 
name | email 
-------|----------- 
first | [email protected] 
second | [email protected] 
third | - 

查詢應該是這樣的

SELECT table1.name, COALESCE(NULLIF(table1.email, ''), 
CASE WHEN table1.callingcardid != NULL 
THEN (SELECT table2.email WHERE id = table1.callingcardid) ELSE '-' END) "email" 

語法顯然是錯誤的,因爲我不能得到它工作。還有一些其他列的連接來自其他表,但除此之外它可以工作。 CASE條款是問題製造者。

數據庫是Microsoft SQL Server 2008(或2012)。

+0

哪裏是你的加入呢?。你能否提供完整的SQL查詢? –

+0

否FROM子句? – jarlh

回答

1

嘗試使用COALESCE,像這樣;

SELECT 
    t1.name 
    ,COALESCE(t1.email, t2.email,'-') email 
FROM Table1 t1 
LEFT JOIN Table2 t2 
    ON t1.callingcardid = t2.id 
+0

謝謝,我過來使它複雜化。這很簡單,很有效。有趣的是,當我得到它的工作,事實證明我甚至不需要查詢,因爲客戶端軟件自動更新電子郵件到table1,如果它存在table2:P – Sami

0

該查詢考慮到電子郵件可能是NULL或第一個表中的空字符串的可能性。在這兩種情況下,都會使用第二張表中的電子郵件。如果沒有電子郵件信息可用,電子郵件將顯示一個短劃線。

SELECT t1.name, 
     CASE WHEN COALESCE(t1.email, '') = '' 
      THEN COALESCE(t2.email, '-') 
      ELSE t1.email END AS email 
FROM table1 t1 
LEFT JOIN table2 t2 
    ON t1.callingcardid = t2.id 
0
SELECT Table1.name 
     , CASE WHEN ISNULL(Table1.email,'') = '' 
       THEN Table2.email 
       ELSE Table1.email 
     END Email 
FROM Table1 
LEFT OUTER JOIN Table2 ON Table1.name = Table2.name