【问题标题】:Get unique rows from two tables, but keep duplicates from the same table从两个表中获取唯一行,但保留同一个表中的重复行
【发布时间】:2021-06-23 17:11:57
【问题描述】:

我想将一个表拆分为两个表(或更多,但假设是两个)。

table_original
id column1 column2
 1   1        2
 2   1        3
 3   1        4
 4   1        4
 5   1        5

我们还可以假设id 是唯一标识符。现在我使用CREATE TABLE table1 AS SELECT * FROM table_original WHERE column2 <= 4CREATE TABLE table2 AS SELECT * FROM table_original WHERE column2 >= 4 将这个表分成两部分。现在我有这两个表:

table1
id column1 column2
 1   1        2
 2   1        3
 3   1        4
 4   1        4
table2
id column1 column2
 3   1        4
 4   1        4
 5   1        5

如何从这两个表中获得与原始表相同的结果?如果我运行查询 SELECT * FROM table1 UNION SELECT * FROM table2 它将与 SELECT * FROM table_original 相同,因为 id 值是唯一的,但是如果我运行查询 SELECT column1, column2 FROM table1 UNION SELECT column1, column2 FROM table2 它会返回:

column1, column2
   1        2
   1        3
   1        4
   1        5

这和SELECT column1, column2 FROM table_original不一样,它返回:

column1, column2
   1        2
   1        3
   1        4
   1        4
   1        5

同一张表中的重复项将被删除。但是,如果我想说对重复项进行计数,结果会有所不同,这很糟糕。那么有没有办法进行UNION 类型操作但保留在同一个表中找到的重复项?

【问题讨论】:

    标签: sql postgresql select union distinct


    【解决方案1】:

    不确定您要达到什么目的,但您需要使用union all

    SELECT column1, column2 FROM table1 
    UNION ALL 
    SELECT column1, column2 FROM table2
    

    union all 保留重复项

    【讨论】:

    • 这会返回column1的4x,column2的值是(1,4),这和我查询原表不一样。
    • 它返回两个表中的任何内容,所以你应该查看你的 table1 和 table2
    【解决方案2】:

    我已经找到答案了。

    为了保留在同一个表中找到的重复项,但消除其他所有内容,我使用了查询 SELECT column1, column2 FROM (SELECT * FROM table1 UNION SELECT * FROM table2) AS t;

    这样,UNION 使用唯一的 id 值来消除真正的重复项,然后我只需过滤结果以获取我需要的列。

    【讨论】:

      【解决方案3】:

      解决方案中整行的UNION 对于大表(和宽行)来说会非常昂贵。对于任何不支持相等运算符的列类型(如json),它都会彻底失败。见:

      利用table1(id) 上的唯一索引,此查询明显更快。 (如果没有,请创建该索引!)

      SELECT column1, column2
      FROM   table1  -- bigger table first to micro-optimize some more
      
      UNION ALL 
      SELECT column1, column2
      FROM   table2 t2
      WHERE  NOT EXISTS (SELECT FROM table1 WHERE id = t2.id)
      

      见:

      关于UNION ALL(而不仅仅是UNION):

      问题仍然存在:为什么要在多个表中保留完全重复的行?

      【讨论】:

      • 感谢优化查询和有用的链接。这只是我正在测试的一个项目,可能会从 1 个表中创建 n 个表,并且它们也可能有一些重复的数据。但是,SELECT 查询应该得到与定向到原始表相同的结果。
      • @John:重复行删除一次?
      猜你喜欢
      • 2012-09-13
      • 1970-01-01
      • 2018-01-15
      • 2023-04-10
      • 1970-01-01
      • 1970-01-01
      • 2021-11-01
      • 2021-12-28
      • 1970-01-01
      相关资源
      最近更新 更多