如何查找另一个表中存在的所有行组

时间:2015-11-21 05:21:05

标签: sql-server tsql

我试图找到所有成员都在另一个组或表中的行组。奇怪的是,我甚至很难用技术术语简明扼要地解释这一点。这是一个人为的例子,但应该表明我想要完成的事情。

我想找到所有孩子都以圣经人物命名的父母。

CREATE TABLE BibleNames (Name varchar(20) NOT NULL);
CREATE TABLE ChildNames (ParentName varchar(20) NOT NULL, ChildName varchar(20) NOT NULL);

INSERT INTO BibleNames (Name) VALUES ('David'),('Adam'),('Deborah'),('Ruth'),('Maria'),('Timothy');
INSERT INTO ChildNames (ParentName, ChildName) VALUES
('Parent1','David'),
('Parent1','Adam'),
('Parent2','Ronnie'),
('Parent2','Ruth'),
('Parent3','Maria'),
('Parent4','Axl'),
('Parent4','Justin');

我已经使用此代码完成了这项任务,但是它有效,但感觉不对,感觉我可能遗漏了SQL Server中的原生内容。

SELECT 
  ParentName
FROM ChildNames c
  LEFT OUTER JOIN BibleNames b
    ON c.ChildName = b.Name
GROUP BY ParentName
HAVING SUM(CASE WHEN b.Name IS NULL THEN 1 ELSE 0 END) = 0;

2 个答案:

答案 0 :(得分:0)

您可以使用exists

执行此操作
select distinct parentname
from childnames c1
where not exists(select * from childnames c2 
             where c1.parentname = c2.parentname and
                   not exists(select * from biblename where name = c2.childname)

答案 1 :(得分:0)

我使用窗口COUNT(*)重写了这个。它执行简单的LEFT JOIN并比较从不同表返回的名称之间的计数。如果他们的计数相符 - 父母应该让他们所有的孩子都有圣经的名字。

;WITH CTE(ParentName, ChildName, BibleName, BN, CN)
AS (
  SELECT CN.ParentName
    , CN.ChildName
    , BN.Name
    , COUNT(CN.ChildName) OVER (PARTITION BY CN.ParentName)
    , COUNT(BN.Name) OVER (PARTITION BY CN.ParentName)
  FROM #ChildNames AS CN
  LEFT JOIN #BibleNames AS BN
    ON BN.Name = CN.ChildName
  )
SELECT *
FROM CTE AS C
WHERE C.BN = C.CN;

对于您的数据,它会带回此结果:

╔════════════╦═══════════╦═══════════╦════╦═════╗
║ ParentName ║ ChildName ║ BibleName ║ BN ║ CN  ║
╠════════════╬═══════════╬═══════════╬════╬═════╣
║ Parent1    ║ David     ║ David     ║  2 ║   2 ║
║ Parent1    ║ Adam      ║ Adam      ║  2 ║   2 ║
║ Parent3    ║ Maria     ║ Maria     ║  1 ║   1 ║
╚════════════╩═══════════╩═══════════╩════╩═════╝

应该有更多方法可以做到这一点。如果诚实的话,这是非常简单的查询。如何写它只是一种品味问题。