0

我对 SQL 很陌生,我有一个关于连接的问题。

我有以下三个表,其中第三个表可以包含有关标题和项目级别的信息

表 1 - 标题

GUID

AAA
BBB
CCC

表 2 - 项目

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

BBB  01
BBB  02
CCC  01

表 3 - 添加信息

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(在标题级别)以及至少一个项目具有 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 专家知道仅使用一个选择和连接而不是“联合”和“不存在”来获得上述结果的可能性 - 在我正在工作的应用程序中,我不能使用联合或“不存在”。

4

1 回答 1

0

您正试图找到具有特定特征的事物组。我认为最好的方法是使用 group by and 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

这封装了您的两个条件。也可以简化为:

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 回答