2016-12-01 54 views
2

2表選擇statment具有來自不同行的連接表的

用戶COLS =名由列,電子郵件

joe|[email protected] 
sara|[email protected] 
alan|[email protected] 

表2是額外的cols =名,列,值

joe|favoritecolor|blue 
joe|boss|sam 
sara|favoritecolor|green 

(確實擴展了第一個表的模式,但不是讓sql引擎注意到它)

要g et peoples favoritecolor

Select name 
     , value As favoritecolor 
From user 
     , extras 
Where extras.name = user.name 
     And extras.col = 'favoritecolor' 

但是我如何得到favoritecolor和boss呢?

注輸出我想這個查詢

select name,email,favoritecolor,boss from user 

joe|[email protected]|blue|sam 
sara|[email protected]|green|<null> 
alan|[email protected]|<null>|<null> 
+0

有了一個額外加入 – Sentry

+0

可以顯示語法請,作爲asnwer所以我得到接受 – pm100

+0

其他兩個打我一個答案,和他們是更好的SQL比我的想法。順便說一句:你的'額外'表看起來像三重商店可疑,也許你應該看看RDF。 – Sentry

回答

5

您可以使用雙使用別名在同一個表連接

(用於連接使用內部連接,如果鍵始終存在並匹配以其它方式使用左連接)

select a.name, e1.value as favoritecolor , e2.value as boss 
from user 
INNER JOIN extras as e1 on e1.name = user.name and e1.col = 'favoritecolor' 
INNER JOIN extras as e2 on e2.name = user.name and e2.col = 'boss' 

如果你的山坳別牛逼的比賽總是你應該使用左加入

select a.name, e1.value as favoritecolor , e2.value as boss 
from user 
left JOIN extras as e1 on e1.name = user.name and e1.col = 'favoritecolor' 
left JOIN extras as e2 on e2.name = user.name and e2.col = 'boss' 

,如果你總是有一個最喜歡的顏色關係,但並不總是一個老闆

select a.name, e1.value as favoritecolor , e2.value as boss 
from user 
Inner JOIN extras as e1 on e1.name = user.name and e1.col = 'favoritecolor' 
left JOIN extras as e2 on e2.name = user.name and e2.col = 'boss' 
+0

,除了我發現這不適用於sara,她沒有老闆,所以我最終沒有輸出。我希望她有老闆 – pm100

+0

@ pm100在我的答案,如果你不匹配總是你應該使用左jojn。(我不知道你真實的數據和條件).anyway我已經更新了這個代碼的答案太..這項工作也當一些列不匹配 – scaisEdge

+0

左連接給我只有主表中有第二個表中的數據的行 – pm100

2

首先,學會用正確的語法JOIN從不FROM條款中使用逗號。 始終使用使用正確的,明確的JOIN語法。

你可以做你想做多東西加入:

select u.name, efc.value as favoritecolor, 
     eb.value as boss 
from user u left join 
    extras efc 
    on efc.name = u.name and efc.col = 'favoritecolor' left join 
    extras eb 
    on eb.name = u.name and eb.col = 'boss'; 

left join需要,以確保行不過濾的,只是因爲他們缺少一個特定的值。

0
SELECT 
    b.name AS ExtraName, 
    b.col  AS ExtraCol, 
    b.value AS ExtraValue, 
    a.name AS UserName, 
    a.email AS UserEmail 
FROM User A INNER JOIN Extras B ON B.name = A.name 
WHERE B.col = 'favorite color' AND b.value = 'Boss' 
+0

這是非常不同的形式其他答案,這是正確的嗎? – pm100

+0

查詢不會返回相同的內容。這個問題有點含糊。提問者需要確定哪一個是正確的。這是我試圖理解這個問題,但我可能沒有正確解釋它。問題措辭有點令人困惑。 –

+0

我希望每行用戶都有一行。我想讓favoritecolor和老闆成爲那一排上的專欄 – pm100

相關問題