我有两张表:curl
和@CATS
@NEWCATS
我想知道@CATS中是否存在一个_Group,其中完全来自@NEWCATS的行(例如'Siamese'和'Japanese')。
在这个例子中,我想返回_Group = 1,但不是_Group = 2(因为_Group = 2包含'Russian')。
即完成此操作:
declare @CATS table (_Group int, _Name nvarchar(50))
declare @NEWCATS table (_Name nvarchar(50))
insert into @CATS (_Group, _Name) values (1, 'Siamese'), (1, 'Japanese'), (2, 'Siamese'), (2, 'Japanese'), (2, 'Russian')
insert into @NEWCATS (_Name) values ('Siamese'), ('Japanese')
注意:无法保证这些组是唯一的,这就是TOP 1的原因。
答案 0 :(得分:2)
这是一种方法:
select CATS._Group
from CATS
left join NEWCATS on NEWCATS._Name = CATS._Name
group by CATS._Group
having sum(case when NEWCATS._Name is null then 1 else 0 end) = 0
如果它们是真实的表并且有索引,那么使用不同访问计划的其他方式可以产生更快的结果。
<强>更新强>
鉴于新要求必须引用NEWCATS
中的所有行:
select CATS._Group
from CATS
left join NEWCATS on NEWCATS._Name = CATS._Name
group by CATS._Group
having sum(case when NEWCATS._Name is null then 1 else 0 end) = 0
and count(*) = ( select count(*) from NEWCATS )
答案 1 :(得分:1)
您可以使用EXCEPT
:
SELECT DISTINCT _group
FROM @CATS
EXCEPT
SELECT c._group
FROM @CATS c
LEFT JOIN @NEWCATS nc
ON nc._Name = c._Name
WHERE nc._Name IS NULL;
的 LiveDemo
强>
修改强>
WITH cte AS
(
SELECT *
FROM (SELECT DISTINCT _Group FROM @CATS) AS c
CROSS JOIN @NEWCATS nc
)
SELECT DISTINCT _group
FROM @CATS
EXCEPT
SELECT COALESCE(c._Group, cte._Group) AS _Group
FROM @CATS c
FULL JOIN cte
ON c._Group = cte._Group
AND c._Name = cte._Name
WHERE c._Name IS NULL
OR cte._Name IS NULL;
的 LiveDemo2
强>
答案 2 :(得分:0)
这是一种要求完全匹配的方法,以便找到的组完全具有所有,但@NEWCATS
表中没有其他名称:
SELECT @CATS._Group
FROM @CATS
LEFT JOIN @NEWCATS ON @CATS._Name = @NEWCATS._Name
GROUP BY @CATS._Group
HAVING COUNT(DISTINCT @NEWCATS._Name)
= (SELECT COUNT(DISTINCT _Name) FROM @NEWCATS);