2015-05-04 41 views
1

這必須很簡單,但我認爲我迷路了。我有一個表答:在左連接中,如果未選擇具有值B的行,請選擇具有值A的行。

name id 
Tom  1 
Barbara 2 
Gregory 3 

...和表B:

id nickname preferred 
1  Spiderman 0 
1  Batman  1 
2  Powerpuff 0 
3  Donald Duck 0 
3  Hulk  1 

我如何查詢表得到一個綽號,最好時(1),或任何其它暱稱,如果首選不可用。

所以Tom的結果是「蝙蝠俠」,而芭芭拉的結果是「Powerpuff」。

+0

結果湯姆將是 「蝙蝠俠」?你打算如何展示它?你試過什麼? – Vikrant

+0

Vikrant,我會用這樣的連接:從表中選擇暱稱在A.id = B.id上的左連接表B.其中A.name =「Tom」; ---但這會給我「蜘蛛俠」和「蝙蝠俠」 – dust

+0

一個人可以擁有多個首選暱稱嗎?多於一個其他暱稱呢? –

回答

3

嘗試以下查詢:

其中1.選擇值爲A的行,否則爲2.選擇值爲B的行
使用LEFT JOIN

SELECT A.name, B.nickname 
FROM A 
LEFT JOIN 
    (
     SELECT MAX(preferred) AS preferred, id 
     FROM B 
     GROUP BY id 
    )AS B1 
ON A.id = B1.id 
LEFT JOIN B ON B.preferred = B1.preferred AND B.id = B1.id 
+1

這個工程,並且比我的更好 –

+1

正如我描述的那樣,這個問題的最佳解決方案。由於我的描述和我的實際問題之間的差異,我不得不使用Giorgi的解決方案,但您的回答仍需要被選爲「唯一」。謝謝:) – dust

+0

謝謝!很高興幫助你! @灰塵。 ;) – Vikrant

3

如果SQLite支持分析功能,那麼這將提供一個相當乾淨和方便的解決方案。雖然沒有這樣的運氣。它確實可以簡化您希望給定人員(最多隻有一個人)或所有非首選人員的所有首選暱稱的問題。它是那麼相當簡單使用內聯鑑於這些情況之間進行區分,並應用適當的濾波器:

SELECT p.name, pn.nickname 
FROM 
    person p 
    JOIN (
     SELECT id, MAX(preferred) AS preferred 
     FROM person_nickname 
     GROUP BY id 
    ) flag 
    ON p.id = flag.id 
    JOIN person_nickname pn 
    ON pn.id = flag.id AND pn.preferred = flag.preferred 
+0

這是行得通的。爲什麼這是低調的? –

+0

是的,這也是一個wrking之一,與解釋'sqlite' – Vikrant

+0

謝謝你的幫助 - 另一個很好的答案,我upvoting它。 – dust

4

只是立即解決:

select a.id, 
     b.nickname 
from a 
join b on a.id = b.id and b.prefered = 1 

union all 

select a.id, 
     b.nickname 
from a 
join b on a.id = b.id and b.prefered = 0 
where a.id not in(
        select a.id 
        from a 
        join b on a.id = b.id and b.prefered = 1 
       ) 

小提琴http://sqlfiddle.com/#!7/0b7db/1

+0

我選擇了Vikrant的答案作爲所描述的一般性問題的最佳答案,但實際上對於我的具體情況(我的原始問題中沒有涉及其詳細信息),您的答案效果更好,因爲它不依賴「最大」功能。感謝您的幫助 - 這裏是一個讚揚。 – dust