如何在SQL中有条件地定义JOIN的ON值?

时间:2011-09-27 08:20:32

标签: mysql sql join

我遇到了条件联接的问题。

这是我的问题:

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

我的table_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。

我想加入table_a和table_b ON table_a.id = @a_id,如果它存在于其他0上。

所以上一个查询的输出将是(@a_id = 2):

James
John. S
Martin. M. Mr

任何人都有想法,博客文章,手册页或任何可以引导我正确查询的内容吗?

谢谢,

3 个答案:

答案 0 :(得分:1)

where a_id = 2 

您的加入可以缩短为using (a_id),因为两个列的名称相同且没有歧义。

不应将

on / using与谓词子句(where

混淆

答案 1 :(得分: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有多个匹配项,这也只会显示一条记录(第一条)

答案 2 :(得分: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的多行?如果有倍数,上面只会带回第一行...