在SQL Server中检查特定ID是否存在于组中的逻辑

8

我有一些示例数据,如下:

INSERT INTO mytable ([ID], [FK_ID], [TYPE_ID])
VALUES
    (1, 10, 1),
    (2, 11, 1), (3, 11, 2),    
    (4, 12, 1), (5, 12, 2), (6, 12, 3),
    (7, 14, 2), (8, 14, 3)

现在,我正在尝试检查每个FK_ID组中是否存在TYPE_ID1和2的精确匹配。
因此,预期的输出应该是:
  1. (1, 10, 1) 这个应该失败
    • 因为在组FK_ID = 10中,我们只有一条记录
  2. (2, 11, 1), (3, 11, 2) 这个应该通过
    • 因为在组FK_ID = 11中,我们有两条记录。
    • 并且两个TYPE_ID都与1和2的值匹配。
  3. (4, 12, 1), (5, 12, 2), (6, 12, 3) 这个也应该失败
    • 因为这里有3条记录。
  4. (7, 14, 2), (8, 14, 3) 这个也应该失败
    • 即使我们有确切的两条记录,它也应该失败,因为这里的TYPE_ID1和2的值不匹配。
以下是我的尝试:
select * 
from mytable t1
where exists (select count(t2.TYPE_ID) 
              from mytable t2 
              where t2.FK_ID = t1.FK_ID
                and t2.TYPE_ID in (1, 2)
              group by t2.FK_ID 
              having count(t2.TYPE_ID) = 2);

这并不像预期的那样工作,因为它也通过了 FK_ID = 12,而它有三条记录。
演示: SQL Fiddle
3个回答

2

可能有几种不同的方法来实现这个。其中一种可能是:

SELECT FK_ID 
FROM mytable
GROUP BY FK_ID
HAVING COUNT(*) = 2
AND MIN(TYPE_ID) = 1
AND MAX(TYPE_ID) = 2

@CodeNewbie 在 Stackoverflow 上感谢别人的最好方式是将其接受为您的答案。 - Valli
我们怎么做呢?我不知道该怎么做。 - CodeNewbie

1

我们可以在group by查询中添加min和max。

select t1.* from mytable t1,
 ( select fk_id, count(*) As cnt from mytable  

              Group by fk_id
              Having count(*) = 2
                AND max(type_id)=2
                ANd min(Type_id) = 1) As t2
 Where t1.fk_id = t2.fk_id 

0
另一种方法,但不如Nenad的优化,是使用SELECT INTO(输出到临时表)然后使用另一个查询仅选择具有正确TYPE_ID值的行。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接