Oracle SQL查找重复数据中的单个行

3

如果我想查找只有一个规则ID为2的联系人,那么需要什么样的SQL语句呢?因此输出应该是联系人ID为1和7。

我不希望在输出中看到联系人ID为5和6,因为它们有多个规则ID,即使它们也有规则ID 2。

Contactid   ruleid
1                   2
5                   3
5                   2
6                   4
6                   2
7                   2

有人能帮忙解决这个问题吗?


是否可能有重复行(即同时具有相同的contactid和相同的ruleid)?例如,如果您有两行contactid = 8ruleid = 2(并且没有其他行针对该contactid),那么结果应该是什么?此外:contactidruleid可以为NULL吗? - user5683823
谢谢您的回复。我们不能有重复行,其中联系人ID 8和规则ID 2将被重复。此外,这两列中都不允许为空。 - sam2539431
4个回答

2
你可以尝试像这样做:

你可以尝试像这样做:

SELECT Contactid FROM <YOURTABLE> 
WHERE ruleid = 2 
AND Contactid NOT IN 
    (SELECT Contactid FROM <YOURTABLE> 
     WHERE ruleid <> 2)

2
如果contactid可能为空,则not in可能无法按预期工作。另外,正确的答案(可能是聚合或GROUP BY查询的某些变体)应该只读取基表一次,而不是两次。 - user5683823
@mathguy没错,分组比使用子查询更高效。 - nbouchet

0

类似这样的代码应该可以正常运行并且高效。

select   contactid
from     table_name
group by contactid
having   min(ruleid) = 2 
     and max(ruleid) = 2

有趣 - 我看到了一个踩票。踩票者是否愿意与社区分享他们对这个查询有什么不满意的地方?为了大家的利益?谢谢! - user5683823
嗨,你的查询对我非常有帮助。它完美地运行了。谢谢你。 - sam2539431

0
WITH your_table_name as(
        SELECT 1 AS Contactid   , 2 AS ruleid FROM DUAL
        UNION ALL
        SELECT 5 AS Contactid   , 3 AS ruleid FROM DUAL
        UNION ALL
        SELECT 5 AS Contactid   , 2 AS ruleid FROM DUAL
        UNION ALL
        SELECT 6 AS Contactid   , 4 AS ruleid FROM DUAL
        UNION ALL
        SELECT 6 AS Contactid   , 2 AS ruleid FROM DUAL
        UNION ALL
        SELECT 7 AS Contactid   , 2 AS ruleid FROM DUAL
)

SELECT t.* FROM (
      SELECT   Contactid   FROM  your_table_name
      WHERE ruleid = 2
      GROUP BY   Contactid 
      HAVING COUNT(*) = 1
    ) t
    left JOIN (
      SELECT   Contactid   FROM  your_table_name
      WHERE ruleid <> 2
      GROUP BY   Contactid 
    ) tt
    ON
    t.Contactid = tt.Contactid
    where tt.Contactid is null

嗨,我尝试了这个,并且添加了一个规则ID = 2的where条件,但是没有起作用。 - sam2539431
我的查询是从表中选择contactid,其中ruleid=2,按ruleid分组,且计数(ruleid)=1。 - sam2539431
@sam2539431 - 你不需要添加任何东西。我已经用CTE更新了我的答案,请查看。 - Oto Shavadze

0

这对你来说不够吗?

select contactid from table group by contactid having count(ruleid)=1

这假设每个contactid将会有一行ruleid=2的记录。在提供的样本数据中是正确的,但在问题陈述中并没有作为保证说明。(不过它可能仍然是正确的!) - user5683823
嗨,谢谢您的回复。一个联系人可能没有规则ID 2是有可能的。 - sam2539431
谢谢Renato的回复。我特别需要ruleid=2,但是我可以在你的查询中再添加一个select来查找ruleid=2。我今天会尝试一下。谢谢。 - sam2539431

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