【问题标题】:Remove duplicates after UNION in SQLSQL中UNION后删除重复项
【发布时间】:2021-05-07 04:18:24
【问题描述】:

我有两张桌子(T1T2

-首先,我从T1 中选择V1V2V3V4,并使用row_number() 函数根据V1V2 列删除重复项。

-其次,我从T2中选择V1V2V3V4并使用row_number()函数根据V1V2列删除重复项。

-第三,我用UNION把这两张表叠起来。

(WITH cte1 AS(
SELECT v1, v2, v3, v4,
row_number()over (PARTITION BY V1, V2  ORDER BY V1) rn
FROM T1)
SELECT V1, V2, V3, V4
FROM cte1 WHERE rn=1)
UNION
(WITH cte2 AS(
SELECT v1, v2, v3, v4,
row_number()over (PARTITION BY V1, V2  ORDER BY V1) rn
FROM T2)
SELECT V1, V2, V3, V4
FROM cte2 WHERE rn=1)

现在我的问题是:如何使用 V1V2V3 列从上面的最终堆叠表中删除重复项?

注意:如果最终堆叠表中有重复项,那么我需要删除 V4=NULL 的记录。但是,如果最终堆叠表中不存在重复项,我仍然需要保留 V4=NULL 的记录。

【问题讨论】:

  • 用您正在使用的数据库标记您的问题。你想要v4 的值是多少?
  • 这里不需要V4。
  • 只需从select 列表中删除V4。它未使用,您需要消除 UNION 实际执行的其他列上的重复项。我想这就是@GordonLinoff 的意义所在。
  • 我在最终结果中实际上需要 V4。
  • 如果您在最终结果中确实需要 V4,请转到 Gordon 的评论之一。你想如何计算它的价值?您已经为 T1T2 完成了此操作:首先,我从 T1 中选择 V1、V2、V3 和 V4,并根据 V1 和 V2 删除重复项。为什么你不能这样做?

标签: mysql sql duplicates union


【解决方案1】:

您可以使用与两个表相同的删除重复项的过程。 它看起来像这样:

WITH cteUnion AS
(   SELECT *, ROW_NUMBER() OVER (PARTITION BY V1,V2,V3 ORDER BY V1) AS rn
    FROM (
        (WITH cte1 AS(
        SELECT v1, v2, v3, v4,
        row_number()over (PARTITION BY V1, V2  ORDER BY V1) rn
        FROM T1)
        SELECT V1, V2, V3, V4
        FROM cte1 WHERE rn=1)
        UNION
        (WITH cte2 AS(
        SELECT v1, v2, v3, v4,
        row_number()over (PARTITION BY V1, V2  ORDER BY V1) rn
        FROM T2)
        SELECT V1, V2, V3, V4
        FROM cte2 WHERE rn=1)
    ) as union
)
SELECT *
FROM cteUnion
WHERE rn = 1

或者如果您只需要列 V1、V2、V3,您可以使用 DISTINCT

SELECT DISTINCT V1,V2,V3
FROM (
    (WITH cte1 AS(
    SELECT v1, v2, v3, v4,
    row_number()over (PARTITION BY V1, V2  ORDER BY V1) rn
    FROM T1)
    SELECT V1, V2, V3, V4
    FROM cte1 WHERE rn=1)
    UNION
    (WITH cte2 AS(
    SELECT v1, v2, v3, v4,
    row_number()over (PARTITION BY V1, V2  ORDER BY V1) rn
    FROM T2)
    SELECT V1, V2, V3, V4
    FROM cte2 WHERE rn=1)
) as union

【讨论】:

  • 谢谢!第一个解决方案对我有用。
  • @user9292 这就是我所问的:“为什么你不能这样做?”
【解决方案2】:

UNION 与 SELECT DISTINCT 相同,而 UNION ALL 与使用 SELECT 类似,但适用于两个表。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-07-21
    • 2022-11-18
    • 2021-04-25
    • 1970-01-01
    • 2023-03-06
    • 2019-07-26
    • 1970-01-01
    • 2017-11-17
    相关资源
    最近更新 更多