How to execute UNION without sorting? (SQL)

前端 未结 10 564
猫巷女王i
猫巷女王i 2021-01-30 21:34

UNION joins two results and remove duplicates, while UNION ALL does not remove duplicates.
UNION also sort the final output.

W

相关标签:
10条回答
  • 2021-01-30 21:48
    SELECT *, 1 AS sort_order
      FROM table1
     EXCEPT 
    SELECT *, 1 AS sort_order
      FROM table2
    UNION
    SELECT *, 1 AS sort_order
      FROM table1
     INTERSECT 
    SELECT *, 1 AS sort_order
      FROM table2
    UNION
    SELECT *, 2 AS sort_order
      FROM table2
     EXCEPT 
    SELECT *, 2 AS sort_order
      FROM table1
    ORDER BY sort_order;
    

    But the real answer is: other than the ORDER BY clause, the sort order will by arbitrary and not guaranteed.

    0 讨论(0)
  • 2021-01-30 21:51

    I assume your tables are table1 and table2 respectively, and your solution is;

    (select * from table1 MINUS select * from table2)
    UNION ALL
    (select * from table2 MINUS select * from table1)
    
    0 讨论(0)
  • 2021-01-30 21:56

    Try this:

      SELECT DISTINCT * FROM (
    
          SELECT  column1, column2 FROM Table1
          UNION ALL
          SELECT  column1, column2 FROM Table2
          UNION ALL
          SELECT  column1, column2 FROM Table3
    
      ) X ORDER BY Column1
    
    0 讨论(0)
  • 2021-01-30 21:58

    "UNION also sort the final output" - only as an implementation artifact. It is by no means guaranteed to perform the sort, and if you need a particular sort order, you should specify it with an ORDER BY clause. Otherwise, the output order is whatever is most convenient for the server to provide.

    As such, your request for a function that performs a UNION ALL but that removes duplicates is easy - it's called UNION.


    From your clarification, you also appear to believe that a UNION ALL will return all of the results from the first query before the results of the subsequent queries. This is also not guaranteed. Again, the only way to achieve a particular order is to specify it using an ORDER BY clause.

    0 讨论(0)
  • 2021-01-30 21:58

    1,1: select 1 from dual union all select 1 from dual 1: select 1 from dual union select 1 from dual

    0 讨论(0)
  • 2021-01-30 22:00

    I notice this question gets quite a lot of views so I'll first address a question you didn't ask!

    Regarding the title. To achieve a "Sql Union All with “distinct”" then simply replace UNION ALL with UNION. This has the effect of removing duplicates.

    For your specific question, given the clarification "The first query should have "priority", so duplicates should be removed from bottom" you can use

    SELECT col1,
           col2,
           MIN(grp) AS source_group
    FROM   (SELECT 1 AS grp,
                   col1,
                   col2
            FROM   t1
            UNION ALL
            SELECT 2 AS grp,
                   col1,
                   col2
            FROM   t2) AS t
    GROUP  BY col1,
              col2
    ORDER  BY MIN(grp),
              col1  
    
    0 讨论(0)
提交回复
热议问题