【问题标题】:Restricting results to only rows where one value appears only once将结果限制为仅一个值仅出现一次的行
【发布时间】:2012-02-01 20:59:21
【问题描述】:

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

ACTIVITY_SK      STUDY_ACTIVITY_SK
100              200
101              201
102              200
100              203

在此示例中,我不希望返回任何 ACTIVITY_SK 为 100 的记录,因为 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

我曾尝试过这样的事情:

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

 )

但是必须有一种更便宜的方法来做到这一点......

【问题讨论】:

    标签: sql oracle aggregate having


    【解决方案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
    

    【讨论】:

    • 嗨,谢谢...没想到我可以统计我分组的内容?看起来我无法避免两次有效地运行相同的查询,a 和 b 之间的连接需要在两个查询中进行,因为正是这个连接创建了重复项。
    • 你可以。通常我不使用 COUNT(*),我总是尝试使用 COUNT(PK_COLUMN),因为 PK 从来没有空值,优化器可以使用该列上的索引。
    【解决方案2】:

    另一种选择:

    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 指的是来自 ACTIVITY 表的唯一标识符)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-07-31
      • 2017-04-02
      • 2021-05-05
      • 1970-01-01
      • 1970-01-01
      • 2021-07-09
      • 2013-12-05
      • 1970-01-01
      相关资源
      最近更新 更多