Sql 将结果限制为仅显示一个值一次的行

Sql 将结果限制为仅显示一个值一次的行,sql,oracle,aggregate,having,Sql,Oracle,Aggregate,Having,我有一个比这里的示例更复杂的查询,但它只需要返回某个字段在数据集中不会出现多次的行 ACTIVITY_SK STUDY_ACTIVITY_SK 100 200 101 201 102 200 100 203 在本例中,我不希望返回任何ACTIVITY_SK为100的记录,因为ACTIVITY_SK在数据集中出现两次 ACTIVITY_SK STUDY_ACTIVITY_S

我有一个比这里的示例更复杂的查询,但它只需要返回某个字段在数据集中不会出现多次的行

ACTIVITY_SK      STUDY_ACTIVITY_SK
100              200
101              201
102              200
100              203
在本例中,我不希望返回任何
ACTIVITY_SK
为100的记录,因为
ACTIVITY_SK
在数据集中出现两次

ACTIVITY_SK      STUDY_ACTIVITY_SK
100              200
101              201
102              200
100              203
数据是一个映射表,在许多连接中使用,但是像这样的多个记录意味着数据质量问题,因此我需要简单地从结果中删除它们,而不是在其他地方导致错误的连接

SELECT 
   A.ACTIVITY_SK,
   A.STATUS,
   B.STUDY_ACTIVITY_SK,
   B.NAME,
   B.PROJECT
 FROM
   ACTIVITY A,
   PROJECT B
 WHERE 
   A.ACTIVITY_SK = B.STUDY_ACTIVITY_SK
我试过这样的方法:

SELECT 
   A.ACTIVITY_SK,
   A.STATUS,
   B.STUDY_ACTIVITY_SK,
   B.NAME,
   B.PROJECT
 FROM
   ACTIVITY A,
   PROJECT B
 WHERE 
   A.ACTIVITY_SK = B.STUDY_ACTIVITY_SK
 WHERE A.ACTIVITY_SK NOT IN
 (

  SELECT 
     A.ACTIVITY_SK,
     COUNT(*)
    FROM
      ACTIVITY A,
      PROJECT B
    WHERE 
    A.ACTIVITY_SK = B.STUDY_ACTIVITY_SK
    GROUP BY A.ACTIVITY_SK
    HAVING COUNT(*) > 1

 )

但是必须有一种更便宜的方法来实现这一点…

类似的东西运行起来可能更“便宜”:

SELECT
   A.ACTIVITY_SK,
   A.STATUS,
   B.STUDY_ACTIVITY_SK,
   B.NAME,
   B.PROJECT
PROJECT B INNER JOIN
   (SELECT 
       ACTIVITY_SK,
       MIN(STATUS) STATUS,
    FROM
      ACTIVITY
    GROUP BY ACTIVITY_SK
    HAVING COUNT(ACTIVITY_SK) = 1 ) A
ON A.ACTIVITY_SK = B.STUDY_ACTIVITY_SK
另一种选择:

select * from (
  SELECT 
     A.ACTIVITY_SK,
     A.STATUS,
     B.STUDY_ACTIVITY_SK,
     B.NAME,
     B.PROJECT,
     count(distinct a.pk) over (partition by a.activity_sk) AS c
   FROM
     ACTIVITY A,
     PROJECT B
   WHERE 
     A.ACTIVITY_SK = B.STUDY_ACTIVITY_SK
) where c = 1;

(其中
a.pk
指的是活动表中的唯一标识符)

嗨,谢谢……我想我不能数一数我正在分组的内容吗?看起来我无法避免两次有效地运行同一个查询,a和b之间的连接需要在两个查询中进行,因为正是这个连接创建了重复项。您可以。通常我不使用COUNT(*),我总是尝试计数(PK_列),因为PK从来没有空值,优化器可以在该列上使用索引。