programing

조건이 있는 왼쪽 조인

telecom 2023. 9. 17. 12:08
반응형

조건이 있는 왼쪽 조인

내가 이 테이블을 가지고 있다고 가정해 보겠습니다.

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에 'qabug' 값만 있어야 합니다(#blocking에서 일치하는 행을 찾을 수 없는 경우)


제 순진한 선택은 이렇습니다.

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

그러나 조건이 먼저 #join table에 적용된 후 결합된 것처럼 보이기 때문에 작동하지 않습니다.

이 문제에 대한 가장 간단한/전형적인 해결책은 무엇입니까?(nested select로 해결할 수 있는 방법이 있지만 더 좋은 방법이 있었으면 좋겠습니다.)

단순히 "qa bug" 기준을 가입에 넣으면 됩니다.

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

하나의 행만 선택하려는 것 같습니다.#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

올바른 선택:

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 
select * 
from #bug t1 
left join #blocking t2 on t1.id = t2.id and t2.name = 'qa bug'

내부 쿼리가 하나의 행만 반환하는지 확인합니다.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 

데모: 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 절의 일부일 때는 null 값이 필터링되는 이유로 필수로 간주됩니다.

그건 그렇고 sqlfiddle.com 은 제 사이트입니다.

언급URL : https://stackoverflow.com/questions/9160991/left-join-with-condition

반응형