2012-09-12 3 views
0

저는 SQL에 익숙하지 않습니다. 조인에 관한 질문이 있습니다.SQL UNION을 JOIN으로 바꾸기

나는 세 번째 테이블 헤더 및 항목 수준에 대한 정보를 포함 할 수있는 다음과 같은 세 개의 테이블을 가지고

표 1 - HEADER

GUID 

AAA 
BBB 
CCC 

표 2 - ITEM

GUID ITEMNR -> Can be 01, 02, ... 99 

BBB 01 
BBB 02 
CCC 01 

표 3 - ADDINFO

GUID INFO ITEMNR -> If 00 info belongs to header, if > 00 info on item level 

AAA xx 00 
BBB yy 00 
BBB xx 10 
CCC zz 00 

이제 info = xx 인 guids를 검색하고 싶습니다. 그러나 info = xx (헤더 레벨에서) 및 적어도 하나의 항목에 info = xx가있는 guid를 찾아야합니다.

So 결과는 일할 수있는 다음과 같은이

GUID ITEMNR 
AAA 00 
BBB 10 

뭔가 같이해야하지만 UNION 사용

SELECT H.GUID, I.itemnr 
from HEADER as H 
inner join ADDINFO as A on H.guid = A.guid and A.itemnr = '00' 
left outer join ITEM as I on I.guid = A.guid 
where 
A.info = 'xx' and 
NOT EXIST (SELECT GUID FROM ADDINFO WHERE ADDINFO.guid = I.guid and 
ADDINFO.itemnr =  I.itemnr) 
UNION 
SELECT H2.GUID, I2.itemnr 
from HEADER as H2 
inner join ADDINFO as A2 on H2.guid = A2.guid and A2.itemnr > '00' 
inner join ITEM as I2 on H2.guid = I2.guid 
where A.info = 'xx' 

은 SQL 전문가의 사람이 하나만 선택하여 위의 결과를 얻을 가능성을 알고 조인합니까 그러나 '노동 조합'이 아니라 '존재하지 않는다' s '- 내가 작업하고있는 응용 프로그램에서 UNION 또는'NOT EXISTS '를 사용할 수 없습니다.

+2

'UNION'과'JOIN'은 매우 다른 것들을합니다. 단순히 대체 할 수는 없습니다. – Oded

+7

설명 해주십시오. _why_ "현재 작업중인 응용 프로그램 UNION을 사용할 수 없거나 '존재하지 않음'을 사용할 수 없습니다." 이것은 매우 드문 사항이며 설명이 필요합니다. – Oded

+0

일치 항목이 항목 수준에 있더라도 머리글의 GUID가 필요합니까? –

답변

0

당신은 특정한 성격을 가진 사물의 그룹을 찾으려고합니다. 가장 좋은 방법은 다음과 같은 절을 사용하는 것입니다.

select guid 
from addinfo 
group by guid 
having sum(case when info = 'xx' and itemnr = '00' then 1 else 0 end) > 0 or -- items on header level 
     sum(case when info = 'xx' and itemnr > '00' then 1 else 0 end) > 0 -- items on the item level 

두 가지 조건이 요약되어 있습니다. 다음과 같이 단순화 할 수도 있습니다 :

select guid 
from addinfo 
group by guid 
having sum(case when info = 'xx' then 1 else 0 end) > 0 
관련 문제