조건이 있는 왼쪽 조인
내가 이 테이블을 가지고 있다고 가정해 보겠습니다.
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
'programing' 카테고리의 다른 글
스파크 스칼라에서 데이터 프레임의 열 이름 바꾸기 (0) | 2023.09.17 |
---|---|
mysql에서 월 일 수를 알아보는 방법 (0) | 2023.09.17 |
Oracle 지갑을 사용할 경우 올바른 JDBC URL 구문은 무엇입니까? (0) | 2023.09.17 |
이클립스/마이SQL 통합 플러그인? (0) | 2023.09.17 |
독시젠 이클립스 플러그인이 자동으로 스터브 문서를 생성합니까? (0) | 2023.09.17 |