Ограничение результатов только строками, в которых одно значение появляется только один раз - PullRequest
3 голосов
/ 02 февраля 2012

У меня есть запрос, который является более сложным, чем приведенный здесь пример, но который должен возвращать только те строки, в которых определенное поле не появляется более одного раза в наборе данных.

ACTIVITY_SK      STUDY_ACTIVITY_SK
100              200
101              201
102              200
100              203

Inв этом примере я не хочу, чтобы возвращались записи с 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

 )

Но должен быть менее дорогой способ сделать это ...

Ответы [ 2 ]

5 голосов
/ 02 февраля 2012

Что-то вроде этого может быть немного "дешевле" для запуска:

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
1 голос
/ 02 февраля 2012

Другая альтернатива:

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)

...