2012-02-06 2 views
11

Пусть я эти таблицыВыравнивание по левому краю с условием

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 таблицы, а затем к нему присоединяется.

Какое простейшее/типичное решение этой проблемы? (У меня есть решение с вложенным select, но я надеюсь, что есть что-то лучше)

+0

MySQL или T-SQL? –

+0

Что такое ПК на #блоке? –

+0

Предпочитается MySQL, но T-SQL тоже в порядке. – stej

ответ

32

Просто поставить «ОК ошибка» критерии в соединении:

select t1.*, t2.name from #bug t1 
left join #blocking t2 on t1.id = t2.id AND t2.name = 'qa bug' 
+0

Спасибо, отлично поработал. – stej

2

Похоже, вы хотите выбрать только одну строку из #blocking и присоединиться к ней до #bug. Я хотел бы сделать:

select t1.id, t1.name, t2.name as `blockingName` 
from `#bug` t1 
left join (select * from `#blocking` where name = "qa bug") t2 
on t1.id = t2.id 
1

убедитесь, что внутренний запрос возвращает только одну строку. Возможно, вам придется добавить верхнюю часть 1, если она возвращает более одного.

select 
t1.id, t1.name, 
(select b.name from #blocking b where b.id=t1.id and b.name='qa bug') 
from #bug t1 
3

правильно выбрать это:

create table bug (
id int primary key, 
name varchar(20) 
) 
insert into bug values (1, 'bad name') 
insert into bug values (2, 'bad condition') 
insert into bug values (3, 'about box') 

CREATE TABLE blocking 
(
pk int IDENTITY(1,1)PRIMARY KEY , 
id int, 
name varchar(20) 
) 
insert into blocking values (1, 'qa bug') 
insert into blocking values (1, 'doc bug') 
insert into blocking values (2, 'doc bug') 


select 
t1.id, t1.name, 
(select b.name from blocking b where b.id=t1.id and b.name='qa bug') 
from bug t1 
2
select * 
from #bug t1 
left join #blocking t2 on t1.id = t2.id and t2.name = 'qa bug' 
1

Вот демо: http://sqlfiddle.com/#!2/414e6/1

select 
    bug.id, 
    bug.name, 
    blocking.name as blockingType 
from 
    bug 
    left outer join blocking on 
     bug.id = blocking.id AND 
     blocking.name = 'qa bug' 
order by 
    bug.id 

Путем добавления "blocking.name" положение под левое внешнее соединение, а не к тому, где вы указываете, что он должен также считаться «внешним» или необязательным. Когда часть предложения where считается считанной (именно поэтому отфильтровываются нулевые значения).

BTW - sqlfiddle.com - это мой сайт.

Смежные вопросы