Удалить дубликаты из объединения в SQL Views (Toad) - PullRequest
0 голосов
/ 04 октября 2019

Это перевод R в SQL. Мой взгляд - это объединение двух взглядов. Затем мне нужно удалить дубликаты из 2 столбцов.

DQC - это объединение двух представлений DEF и DCF. DEF и DCF имеют одинаковые 8 столбцов в одинаковом порядке.

Я пытался использовать CTE, например

CREATE VIEW DQC_FINAL AS (
WITH CTE
AS (SELECT 
RN=ROW_NUMBER() OVER (PARTITION BY ITEM, CODE), *
FROM DQC
)
SELECT ITEM, CODE
FROM CTE WHERE RN > 1);

Я не уверен, что это лучший вариант. Я просто пытаюсь удалить любые дубликаты в столбце ПУНКТ и КОД. UNION должен был это сделать, но я не получаю правильный вывод.

CREATE VIEW DQC AS
SELECT * 
FROM DEF
UNION
SELECT *
FROM DCF;

Этот вывод почему-то похож на UNION ALL. Количество записей DEF + DCF = количество записей DQC. Вот правильно работающий код R:

DQC <- rbind(DEF,DCF)
DQC <- DQC[!duplicated(DQC$ITEM, DQC$CODE),]

Мысли? Спасибо.

1 Ответ

1 голос
/ 04 октября 2019

UNION устраняет дубликаты между двумя представлениями в всех столбцах. Есть несколько причин, которые могут вызвать дубликаты в (ITEM, CODE):

  1. , либо записи, в которых дублируется этот набор столбцов, имеют другие значения в других столбцах;поскольку эти записи не являются true дубликатами, UNION не устраняет их. В этом случае ваше решение с CTE - правильный подход.

  2. или одно из представлений (возможно, оба) уже содержит дубликаты (истинные или частичные). UNION не удаляет дубликаты (даже если они являются истинными дубликатами), поскольку они не распространяются на два запроса.

В обоих случаях в качестве оптимизации вы могли бывозможно, пропустите промежуточное представление, напрямую дедуплицировав результат запроса UNION. Если в представлениях есть истинные дубликаты, вы можете просто использовать SELECT DISTINCT для каждого из UNION ed запросов. В противном случае, если вы имеете дело с частичными дубликатами, вы можете обернуть все UNION запросов в CTE и использовать ROW_NUMBER() для удаления дубликатов, как показано в существующем коде.

Заключительная мысль: так как вызаметил, что UNION на самом деле не удаляет никакую запись, вам лучше использовать UNION ALL вместо этого: это означает, что меньше работы для вашей СУБД, и сделает запросы, относящиеся к окончательному виду, более эффективными.

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