2014-01-23 53 views
1

我創造了這樣的小提琴,在此鏈接: http://www.sqlfiddle.com/#!2/7e007選擇是否值存在

我could'nt發現SQL緊湊/ CE所以它是在MySQL。

的表格看起來像這樣

Records      Clients 
ID | NAME | AGE   ID | NAME  
------------------   ---------------- 
1 | John | 20   1 | John 
2 | Steven | 30   2 | Daniel 
3 | Abraham | 30   3 | 
4 | Donald | 25   5 | Lisa 
6 |   | 35   6 | Michael 
7 |   | 42   7 | 

我想從兩個表中選擇,如果ID是兩個表中,並都有名字,我想的名字從「客戶」作爲默認。如果記錄中的名稱爲空,請使用客戶名稱(如果有)以及Clients.Name爲空;使用records.Name。

從上面的表,我想這一點:

ID | NAME | AGE 
------------------ 
1 | John | 20 
2 | Daniel | 30 
3 | Abraham | 30 
4 | Donald | 25 
5 | Lisa | 
6 | Michael | 35 
7 |   | 42 

我如何在SQL精簡做到這一點?

編輯: 感謝偉大的答案在下面,我設法想出這個查詢,幾乎工程:

SELECT t.id, t.name, t.age FROM 
(
    (
     SELECT r.id, 
     CASE WHEN r.name = NULL THEN c.name ELSE r.name END as name, 
     r.age 
     FROM Records r 
     LEFT JOIN Clients c ON c.id = r.id 
    ) 
    UNION 
    (
     SELECT c.id, c.name, null as age FROM Clients c where c.id NOT IN (select id from Records) 
    ) 
) as t ORDER BY t.id 

這給了我這樣的輸出:

ID | NAME | AGE 
------------------ 
1 | John | 20 
2 | Daniel | 30 
3 | Abraham | 30 
4 | Donald | 25 
5 | Lisa | 
6 |   | 35 
7 |   | 42 

「邁克爾」 (應該在#6)在這種情況下缺少。爲什麼?!

+0

在案件中使用此部分:'CASE WHEN c.name <>''' –

+0

@BrokenHeartღ也嘗試過這一點,結果相同。 「當c.name not是null時,使用c.name或者使用r.name」。 「邁克爾」不見了,這真是令人困惑。 – gubbfett

+0

@BrokenHeartღ抱歉!你完全正確。 <> NULL是錯誤的(即使這個帖子實際上是空的),但是當我改成<>''它工作。我會給你的答案的信譽。謝謝! – gubbfett

回答

0
select r.id, 
    IF(c.name != '',c.name,r.name) as name, 
    r.age 
FROM Records r 
LEFT JOIN Clients c ON c.id = r.id 
GROUP BY c.id 

使用上述查詢。

編輯:

SELECT t.id, t.name, t.age FROM 
(
    (
     SELECT r.id, 
     CASE WHEN c.name <> '' THEN c.name ELSE r.name END as name, 
     r.age 
     FROM Records r 
     LEFT JOIN Clients c ON c.id = r.id 
    ) 
    UNION 
    (
     SELECT c.id, c.name, null as age FROM Clients c where c.id NOT IN (select id from Records) 
    ) 
) as t ORDER BY t.id 

使用此查詢。

+0

酷。但是它跳過了「麗莎」,因爲她不在「記錄」表中。否則這是正確的。 – gubbfett

+0

@gubbfett使用連接而不是左連接 –

+0

如果我只使用連接,我只能得到1,2,3,6,7。 「唐納德」和「麗莎」缺失。 – gubbfett

0

使用COALECSE率先拿到非空值:

select id, coalesce(clients.name, records.name) as correct_name, records.age 
from records 
join clients using (id); 

編輯:如果不存在名稱存儲爲「」,而不是NULL使用:

select id, case when clients.name = '' then records.name else clients.name end as correct_name, records.age 
from records 
join clients using (id); 

當然,你可以也通過要求對''和NULL作出反應

when clients.name = '' or clients.name is null then 

請參閱http://www.sqlfiddle.com/#!2/7e007/36

+0

不錯!但是,當我嘗試這個,我跳過一些值。在這種情況下,我剛剛獲得了我的數據1,2,3,6,7 – gubbfett

+0

啊,我看到,我沒有存儲NULL,而是存儲了我期望的內容,因此您將缺少名稱存儲爲「'。我正在編輯我的答案。 –

+0

其實,在我的測試設置中,我使用空值。在這種情況下,空或'並不重要,我可以同時使用它們。我已經嘗試了他們兩個一些調整,但我無法讓他們工作。正如你可以在小提琴中看到的那樣,它會從Clients表中留下一些值,因爲select是「FROM Clients」(?)。 – gubbfett

0
select case when a.id <> '' then a.id else b.id end as id , 
case when a.name <> '' then a.name else b.name end as name,a.age 
from records a 
full outer join clients b on a.Id = b.id 
order by a.id 
+0

這是在SQL中,將根據您的sqlfiddle中的數據爲您的senario正常工作.... –

+0

我得到的錯誤''全外部加入'是不是在SqlCE' – gubbfett

+0

'提供噢抱歉,我不知道SqlCE我的查詢與SQL Server一起使用,請檢查是否有任何其他替代品爲 –

0

請嘗試,希望這將工作..

select c.id, 
IF(NAME='',(select name from Records where id = c.id),'') 
If(NAME=NULL,(select name from Records where id = c.id),NULL) 
Else c.NAME 
from client c; 

的歡呼聲!