2013-07-23 40 views
0

兩個表:內加入甲對乙當B不是空的,否則,

prefix (id, value) 
--------------------- 
1 'hello' 
2 'good afternoon' 
3 'good night' 


suffix (id, value) 
--------------------- 
1 'world' 
3 'world' 

我想獲得 所有從表prefix它可以通過id

上表suffix加入

結果應該是這樣的:

prefix.id prefix.value 
-------------------------- 
1   'hello'   
3   'good night' 

很好 - 非常容易那麼遠, 但如果表後綴爲我想一切從表prefix 沒有子查詢/熱膨脹係數或if....一個查詢滿足兩個條件! 有沒有什麼竅門可以通過一些有魔力的條款或其他棘手的東西來完成這件事?

Just for testcases: SQL-fiddle

+0

「空虛」是什麼意思? –

+4

@huMptyduMpty不,他想要一個'INNER JOIN',除非表B是完全空的。顯然,他希望在不添加任何邏輯的查詢 – Lamak

+0

@DavidSöderlund「空」根本只是強調「空」;) – Nico

回答

3

那麼,有一種方式,但我同意其他人,你的要求沒有(實際)的意義。

總之,在這裏你去:

  1. 加入suffix表兩次(每次用左連接)。一個連接在id列上,另一個連接總是處於真實狀態。

  2. 將輸出結果分組到prefix列中,並將至少一個第一個實例suffix的非空列分組。

  3. 在HAVING子句中,把一個條件,即所述第一suffix列不爲空或一個非空的列的值的第二個實例suffix的數量爲0(顯然,每個組將具有相同數目的行的,即計數將成爲每個prefix行的相同)

這是查詢:

SELECT prefix.id, prefix.value 
FROM prefix 
LEFT JOIN suffix ON prefix.id = suffix.id 
LEFT JOIN suffix AS test ON 1=1 
GROUP BY prefix.id, prefix.value, suffix.id 
HAVING suffix.id IS NOT NULL OR COUNT(test.id) = 0; 

而且也有一個演示at SQL Fiddle

+0

爲什麼這麼複雜?爲什麼不簡單地選擇prefix.id,prefix.value FROM前綴 LEFT JOIN後綴ON prefix.id = suffix.id WHERE suffix.id不爲空OR NOT EXISTS(SELECT 1 FROM suffix);另請參閱http://sqlfiddle.com/#!6/5fa3a/14 – pkExec

+1

要求不是有任何子查詢,這是我在這裏處理的要點。雖然問題中的措辭是「沒有子選項/選項」,但從OP在Tim Schmelter的回答中的評論中發現,他們並不希望EXISTS子查詢。我在腦海中提出了我的解決方案。不過,我認爲結果相當難看。 –

2

你需要一個ORNOT EXISTS

SELECT 
    prefix.id, prefix.value 
FROM 
    prefix 
WHERE 
    EXISTS(SELECT 1 from suffix WHERE prefix.id=suffix.id) 
    OR NOT EXISTS(SELECT 1 FROM suffix) 

Demo

+2

它使用子查詢 – CompanyDroneFromSector7G

+0

Works來實現所需的結果,但使用子查詢。 – Nico

+6

@Nico你希望有人重新編寫T-SQL語言來執行你之後的魔法嗎? –

相關問題