2011-09-27 41 views
0

我面臨有條件連接的問題。如何在SQL中有條件地定義JOIN的ON值?

這是我的查詢:

SELECT table_b.name 
FROM table_a 
LEFT JOIN table_b 
ON table_a.id = table_b.a_id 

我的表-B的描述:

id, a_id, ref_z, name 
---------------------- 
1 | 0 | 1 | James 
2 | 0 | 2 | John 
3 | 2 | 2 | John. S 
4 | 0 | 3 | Martin 
5 | 6 | 3 | Martin. M 
6 | 2 | 3 | Martin. M. Mr 

比方說,我有一個參數@a_id。

我想加盟表-A和表-B ON table_a.id = @a_id如果在0

否則存在那麼前面的查詢的結果應該是(與@a_id = 2):

James 
John. S 
Martin. M. Mr 

任何人都有一個想法,博客文章,手冊頁或任何其他可以讓我得到正確查詢的東西嗎?

謝謝

回答

1
where a_id = 2 

您的加入,可以縮短到using (a_id),因爲兩列具有相同的名稱,沒有歧義。

on/using不應混淆你的謂語從句(where

+0

感謝您的答案。問題是,如果你把table_b的行id = 1,它不會帶回where子句。當它應該是因爲它應該是如果存在@a_id的行,那麼這一個與零的一個。 – Spredzy

+0

您可以操縱連接來完成此操作。 –

0

假設你只有一個表,這個工作對我來說

DECLARE @t TABLE 
(
id int, 
a_id int, 
ref_z int, 
name varchar(50) 
) 

INSERT INTO @t VALUES (1, 0, 1, 'James'), 
(2, 0, 2, 'John'), 
(3, 2, 2, 'John. S'), 
(4, 0, 3, 'Martin'), 
(5, 6, 3, 'Martin. M'), 
(6, 2, 3, 'Martin. M. Mr') 

DECLARE @a_id int = 2 

SELECT COALESCE(table_b.name, (SELECT table_b2.name FROM @t AS table_b2 WHERE table_b2.a_id = 0 ORDER BY table_b2.id LIMIT 1)) AS name 
FROM (
SELECT ref_z 
FROM @t AS table_z 
GROUP BY ref_z 
) AS table_z 
LEFT OUTER JOIN @t AS table_b ON table_b.ref_z = table_z.ref_z AND table_b.a_id = @a_id 

而且結果:

James 
John. S 
Martin. M. Mr 

而且請注意,如果a_id = 0有多個匹配項,這也只會顯示一條記錄(第一條)

0

你可以嘗試使用IFNULL與子選擇?:

SELECT ifnull(table_b.name,(select s.name from table_a sa inner join table_b sb on sa.a_id = sb.a_id where sb.a_id = 0 limit 1)) as name 
FROM table_a 
LEFT JOIN table_b 
ON table_a.id = table_b.a_id; 

未經檢驗的,我害怕,但希望它幫助!

另外 - 你想如何處理多行與a_id = 0?以上只會帶回第一排,如果有多個...