从两个表中获取父ID

时间:2015-11-07 15:21:27

标签: sql sql-server

我有两张表: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的原因。

3 个答案:

答案 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);