0

私は SQL にかなり慣れていないので、結合に関して質問があります。

次の 3 つのテーブルがあります。3 番目のテーブルには、ヘッダーとアイテム レベルに関する情報を含めることができます。

表 1 - ヘッダー

GUID

AAA
BBB
CCC

表 2 - 項目

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 の guid を検索したいのですが、info = xx (ヘッダー レベル) の guid と、少なくとも 1 つのアイテムに info = xx がある guid を見つける必要があります。

したがって、結果は次のようになります

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の専門家の誰もが、「ユニオン」と「存在しない」ではなく、1つの選択と結合のみを使用して上記の結果を取得する可能性を知っていますか?私が作業しているアプリケーションでは、UNIONまたは「NOT EXISTS」を使用できません。

4

1 に答える 1

0

特定の特徴を持つもののグループを見つけようとしています。最良の方法は、group by と having 句を使用することだと思います。

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

これにより、2 つの条件がカプセル化されます。次のように簡略化することもできます。

select guid
from addinfo
group by guid
having sum(case when info = 'xx' then 1 else 0 end) > 0
于 2012-09-12T15:25:03.473 に答える