我希望能够返回不包含特定行的子表中的唯一ID列表。如何确定表中是否存在某些行的组合
我的表看起来类似于:
Id Name
1 X
1 Y
1 Z
2 A
2 B
2 C
3 X
3 B
3 Z
我想写像
SELECT Id
FROM table t
WHERE UPPER(t.Name) IN ('X', 'Y', 'Z')
OR UPPER(t.Name) IN ('A', 'B', 'C')
GROUP BY t.Id
HAVING COUNT(DISTINCT UPPER(t.Name)) != 3
一个SQL查询但是,这并不工作,因为我希望只有ID = 3要返回无效。
这是可能在一个单一的SQL语句?
此外,如果有任意数量的列表(X,Y,Z; A,B,C; P,Q,Z; ...)或混合列表长度( X,Y; A,B,C,D; L,M,N; ...)
编辑:
为了澄清,每个ID确实是指一个父表。所以这些都是儿童记录。
在第一个示例中,父记录仅在包含至少3个子项时才有效。这3名儿童必须命名为(A,B和C)或(X,Y和Z)。父母即使包含全部6个孩子,也是有效的。但有4个名为A,B,X,Y的孩子无效(添加C或Z孩子会使其有效)。
到目前为止,Gordon Linoff是最接近的。我需要写更多的测试。
当然这是一个人为的例子,在我的实现中,不同的规则集将要求我使用不同大小的不同列表(可能混合)。例如,我可能有一个规则,只有当父项名为(A和B)或(W,X,Y和Z)或(L,M,N和Z)的子项时,父项才有效。
感谢,
您使用的是什么RDBMS(Oracle,MySQL,SQL Server,...)? – peterm
所有的ID都有3个不同的名字,你的有条件会把所有东西都去掉。 – Andrew
我需要同时支持SQL Server和Oracle。 – SergioL