Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/87.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用联接替换SQL联合_Sql - Fatal编程技术网

用联接替换SQL联合

用联接替换SQL联合,sql,Sql,我对SQL非常陌生,我有一个关于连接的问题 我有以下三个表,其中第三个表可以包含标题和项目级别的信息 表1-标题 GUID AAA BBB CCC 表2-项目1 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

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

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

表1-标题

GUID

AAA
BBB
CCC
表2-项目1

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专家中是否有人知道只使用一个select和JOIN而不使用“union”和“not exists”来获得上述结果的可能性?在我正在使用的应用程序中,我无法使用union或“not exists”。

您正在尝试查找具有特定特征的事物组。我认为最好的方法是使用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
这封装了两个条件。也可以简化为:

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

UNION
JOIN
做了非常不同的事情。您不能简单地替换它们。请解释为什么“我正在使用的应用程序不能使用UNION或‘不存在’”。这是非常不寻常的,需要解释。即使匹配项位于项目级别,您也需要标题的guid吗?