我试图找到所有成员都在另一个组或表中的行组。奇怪的是,我甚至很难用技术术语简明扼要地解释这一点。这是一个人为的例子,但应该表明我想要完成的事情。
我想找到所有孩子都以圣经人物命名的父母。
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;
答案 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 ║
╚════════════╩═══════════╩═══════════╩════╩═════╝
应该有更多方法可以做到这一点。如果诚实的话,这是非常简单的查询。如何写它只是一种品味问题。