一尘不染

有条件的左连接

sql

假设我有这些表

create table bug (
    id int primary key, 
    name varchar(20)
)
create table blocking (
    pk int primary key,
    id int, 
    name varchar(20)
)

insert into bug values (1, 'bad name')
insert into bug values (2, 'bad condition')
insert into bug values (3, 'about box')
insert into blocking values (0, 1, 'qa bug')
insert into blocking values (1, 1, 'doc bug')
insert into blocking values (2, 2, 'doc bug')

并且我想加入id列中的表,结果应该是这样的:

id          name                 blockingName
----------- -------------------- --------------------
1           bad name             qa bug
2           bad condition        NULL
3           about box            NULL

这意味着:我想从#bug返回所有行,在’blockingName’列或NULL中应该只有’qa bug’值(如果在#blocking中找不到匹配的行)


我天真的选择是这样的:

select * from #bug t1 
    left join #blocking t2 on t1.id = t2.id
    where t2.name is null or t2.name = 'qa bug'

但这是行不通的,因为似乎先将条件应用于#blocking表,然后再将其加入。

这个问题最简单/典型的解决方案是什么?(我有一个嵌套选择的解决方案,但我希望有更好的选择)


阅读 144

收藏
2021-03-17

共1个答案

一尘不染

只需在联接中放入“ qa bug”标准:

select t1.*, t2.name from #bug t1 
left join #blocking t2 on t1.id = t2.id AND t2.name = 'qa bug'
2021-03-17