从 SQL 视图中的联合删除重复项 (Toad)

Remove duplicates from union in SQL Views (Toad)

这是 R 到 SQL 的翻译。我的观点是两种观点的结合。然后我需要从 2 列中删除重复项。

DQC 是两个视图 DEFDCF 的并集。 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);

我不确定这是否是最佳选择。我只是想删除 ITEM 和 CODE 列中的所有重复项。 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),]

想法?谢谢。

UNION 消除了 所有 列中两个视图之间的重复项。有多种原因可能导致 (ITEM, CODE) 上出现重复:

  1. 该列元组重复的记录在其他列中具有不同的值;由于这些记录不是 true 重复项,因此 UNION 不会消除它们。在这种情况下,您使用 CTE 的解决方案是正确的方法。

  2. 或其中一个视图(可能两者都有)已经包含重复项(无论是真实的还是部分的)。 UNION 不会删除重复项(即使它们是真正的重复项),因为它们不会分布在两个查询中。

在这两种情况下,作为优化,您可以通过直接删除 UNION 查询的结果来跳过中间视图。如果视图中确实存在重复项,那么您只需对每个 UNIONed 查询使用 SELECT DISTINCT。否则,如果您正在处理部分重复项,那么您可以将整个 UNION 查询包装在 CTE 中并使用 ROW_NUMBER() 删除重复项,如现有代码所示。

最后一个想法:既然您注意到 UNION 实际上并没有删除任何记录,那么您最好改用 UNION ALL:这意味着您的 RDBMS 的工作更少,并且会进行查询解决最后查看效率更高。