Подтвердить что ты не робот

Как выполнить UNION без сортировки? (SQL)

UNION объединяет два результата и удаляет дубликаты, а UNION ALL не удаляет дубликаты.
UNION также сортирует окончательный результат.

То, что я хочу, это UNION ALL без дубликатов и без сортировки. Это возможно?

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

4b9b3361

Ответ 1

Я замечаю, что этот вопрос получает довольно много просмотров, поэтому я сначала рассмотрю вопрос, который вы не задавали!

Относительно названия. Чтобы достичь "Sql Union All с" отличным ", просто замените UNION ALL на UNION. Это приводит к удалению дубликатов.

Для вашего конкретного вопроса, учитывая пояснение "Первый запрос должен иметь" приоритет ", поэтому дубликаты должны быть удалены снизу" вы можете использовать

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  

Ответ 2

"UNION также сортирует окончательный результат" - только как артефакт реализации. Это отнюдь не гарантирует выполнение сортировки, и если вам нужен конкретный порядок сортировки, вы должны указать его с предложением ORDER BY. В противном случае порядок вывода будет самым удобным для сервера.

Таким образом, ваш запрос для функции, которая выполняет UNION ALL, но который удаляет дубликаты, прост - он называется UNION.


Из вашего разъяснения вы также полагаете, что UNION ALL вернет все результаты первого запроса перед результатами последующих запросов. Это также не гарантируется. Опять же, единственный способ добиться определенного порядка - указать его с помощью предложения ORDER BY.

Ответ 3

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;

Но реальный ответ: иначе, чем предложение ORDER BY, порядок сортировки будет произвольным и не гарантирован.

Ответ 4

Рассмотрим эти таблицы (стандартный код SQL, выполняется на SQL Server 2008):

WITH A 
     AS 
     (
      SELECT * 
        FROM (
              VALUES (1), 
                     (2), 
                     (3), 
                     (4), 
                     (5), 
                     (6) 
             ) AS T (col)
     ),
     B 
     AS 
     (
      SELECT * 
        FROM (
              VALUES (9), 
                     (8), 
                     (7), 
                     (6), 
                     (5), 
                     (4) 
             ) AS T (col)
     ), ...

Желаемый эффект заключается в сортировке таблицы A на col по возрастанию, сортировке таблицы B на col по убыванию, а затем на объединение двух, удаление дубликатов, сохранение порядка перед объединением и вывод таблицы A результатов на "вершине" с таблицей B на "нижней", например (pesudo code)

(
 SELECT *
   FROM A
  ORDER 
     BY col
)
UNION
(
 SELECT *
   FROM B
  ORDER 
     BY col DESC
);

Конечно, это не будет работать в SQL, потому что может быть только одно предложение ORDER BY, и оно может быть применено только к выражению таблицы верхнего уровня (или независимо от того, как выдается запрос SELECT; Я называю это "resultet" ).

Первое, что нужно адресовать, - это пересечение между двумя таблицами, в этом случае значения 4, 5 и 6. Как следует сортировать пересечение, необходимо указать в коде SQL, поэтому желательно, чтобы конструктор тоже это задал! (то есть лицо, задающее вопрос, в данном случае).

В этом случае подразумевается, что пересечение ( "duplicates" ) должно быть отсортировано в результатах для таблицы A. Поэтому отсортированный набор результатов должен выглядеть следующим образом:

      VALUES (1), -- A including intersection, ascending
             (2), -- A including intersection, ascending
             (3), -- A including intersection, ascending
             (4), -- A including intersection, ascending
             (5), -- A including intersection, ascending
             (6), -- A including intersection, ascending
             (9), -- B only, descending 
             (8), -- B only, descending  
             (7), -- B only, descending 

Примечание в SQL "top" и "bottom" не имеет никакого смысла, и таблица (кроме набора результатов) не имеет встроенного порядка. Также (чтобы сократить длинный рассказ) рассмотрим, что UNION удаляет повторяющиеся строки по импликации и должен применяться до ORDER BY. Вывод должен заключаться в том, что каждый порядок сортировки таблиц должен быть явно определен путем раскрытия столбца (-ов) сортировки сортировки до, объединенного. Для этого мы можем использовать оконную функцию ROW_NUMBER(), например.

     ...
     A_ranked
     AS
     (
      SELECT col, 
             ROW_NUMBER() OVER (ORDER BY col) AS sort_order_1
        FROM A                      -- include the intersection
     ),
     B_ranked
     AS
     (
      SELECT *, 
             ROW_NUMBER() OVER (ORDER BY col DESC) AS sort_order_1
        FROM B
       WHERE NOT EXISTS (           -- exclude the intersection
                         SELECT * 
                           FROM A
                          WHERE A.col = B.col 
                        )
     )
SELECT *, 1 AS sort_order_0 
  FROM A_ranked
UNION
SELECT *, 2 AS sort_order_0 
  FROM B_ranked
ORDER BY sort_order_0, sort_order_1;

Ответ 5

select T.Col1, T.Col2, T.Sort
from 
    (
      select T.Col1,
             T.Col2,
             T.Sort,
             rank() over(partition by T.Col1, T.Col2 order by T.Sort) as rn
      from
          (
            select Col1, Col2, 1 as Sort
            from Table1
            union all
            select Col1, Col2, 2
            from Table2
          ) as T
    ) as T
where T.rn = 1    
order by T.Sort

Ответ 6

Попробуйте это:

  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

Ответ 7

Сорт используется для устранения дубликатов и неявна для запросов DISTINCT и UNION (но не UNION ALL) - вы все равно можете указать столбцы, которые вы хотите заказать, если они вам нужны, отсортированы по определенным столбцам.

Например, если вы хотите отсортировать по наборам результатов, вы можете ввести дополнительный столбец и отсортировать их первым:

SELECT foo, bar, 1 as ResultSet
FROM Foo
WHERE bar = 1
UNION
SELECT foo, bar, 2 as ResultSet
FROM Foo
WHERE bar = 3
UNION
SELECT foo, bar, 3 as ResultSet
FROM Foo
WHERE bar = 2
ORDER BY ResultSet

Ответ 8

Я предполагаю, что ваши таблицы - table1 и table2 соответственно, и ваше решение:

(select * from table1 MINUS select * from table2)
UNION ALL
(select * from table2 MINUS select * from table1)

Ответ 9

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

Ответ 10

Вы можете сделать что-то вроде этого.

Select distinct name from  (SELECT r.name FROM outsider_role_mapping orm1 
    union all
SELECT r.name FROM user_role_mapping orm2
) tmp;