3

ここの例よりも複雑なクエリがありますが、特定のフィールドがデータ セットに複数回出現しない行のみを返す必要があります。

ACTIVITY_SK      STUDY_ACTIVITY_SK
100              200
101              201
102              200
100              203

この例では、データ セットに 2 回出現する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

 )

しかし、これを行うためのより安価な方法があるはずです...

4

2 に答える 2

5

このようなものは、実行するのが少し「安く」なる可能性があります。

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
于 2012-02-01T21:07:56.410 に答える
1

別の選択肢:

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テーブルからの一意の識別子を参照します)

于 2012-02-02T05:24:33.137 に答える