Смешайте результат объединения всех запросов и упорядочите их построчно - PullRequest
0 голосов
/ 15 мая 2018

Я прошу прощения, если название вопроса неясно.

У меня есть этот пример запроса:

SELECT a.i_id,
       a.i_item,
       a.i_count
  FROM abc a
 WHERE i_id = 123
UNION ALL
SELECT b.j_id,
       b.j_item,
       b.j_count
  FROM def b
 WHERE j_id = 4567

, который возвращает результат на скриншоте 1. enter image description here

Я хочу изменить запрос, чтобы он мог возвращать то, что показано на скриншоте 2. enter image description here

Ответы [ 4 ]

0 голосов
/ 15 мая 2018

Без предложения ORDER BY порядок результата запроса полностью исключен. Если оранжевая часть результата основана на первом запросе, а синяя - на втором, это никоим образом не гарантируется.

Поэтому добавьте предложение ORDER BY в конце вашего запроса. Не ясно, по какому атрибуту вы хотите отсортировать. Вот некоторые возможности:

Вариант 1. Храните одни и те же предметы, всегда сначала один идентификатор, а затем другой.

...
ORDER BY i_item, i_id;

Вариант 2: вести одинаковый подсчет вместе, всегда сначала один идентификатор, затем другой

...
ORDER BY i_count, i_id;

Вариант 3: чередовать идентификаторы, начинать с первых элементов, затем вторых, ...

ORDER BY row_number() over (partition by i_id order by i_item), i_id;
0 голосов
/ 15 мая 2018

Предполагая, что в вашем реальном примере вы не можете просто ORDER BY i_item или ORDER BY i_count получить желаемый заказ, тогда:

SQL Fiddle

Настройка схемы Oracle 11g R2 :

CREATE TABLE abc ( i_id, i_item, i_count ) AS
SELECT 123, 'apple',  100 FROM DUAL UNION ALL
SELECT 123, 'banana', 200 FROM DUAL UNION ALL
SELECT 123, 'candy',  300 FROM DUAL;

CREATE TABLE def ( j_id, j_item, j_count ) AS
SELECT 4567, 'apple',  100 FROM DUAL UNION ALL
SELECT 4567, 'banana', 200 FROM DUAL UNION ALL
SELECT 4567, 'candy',  300 FROM DUAL;

Запрос 1 :

SELECT i_id,
       i_item,
       i_count
FROM   (
  SELECT i_id,
         i_item,
         i_count,
         ROWNUM,
         1
    FROM abc
   WHERE i_id = 123
  UNION ALL
  SELECT j_id,
         j_item,
         j_count,
         ROWNUM,
         2
    FROM def
   WHERE j_id = 4567
  ORDER BY 4, 5
)

Результаты :

| I_ID | I_ITEM | I_COUNT |
|------|--------|---------|
|  123 |  apple |     100 |
| 4567 |  apple |     100 |
|  123 | banana |     200 |
| 4567 | banana |     200 |
|  123 |  candy |     300 |
| 4567 |  candy |     300 |
0 голосов
/ 15 мая 2018

Создайте представление и используйте следующий простой запрос, альтернативно:

CREATE VIEW ghi AS
SELECT a.i_id,
       a.i_item,
       a.i_count
  FROM abc a
 WHERE i_id = 123
UNION ALL
SELECT b.j_id,
       b.j_item,
       b.j_count
  FROM def b
 WHERE j_id = 4567;  

SELECT *
  FROM ghi
 ORDER BY  i_item, i_id;

Демонстрация SQL Fiddle

0 голосов
/ 15 мая 2018

ПРОИЗВОДНАЯ СТОЛОВАЯ СОРТИРОВКА

select * from 
(    SELECT a.i_id,
           a.i_item,
           a.i_count
      FROM abc a
     WHERE i_id = 123
    UNION ALL
    SELECT b.j_id,
           b.j_item,
           b.j_count
      FROM def b
     WHERE j_id = 4567
) X
order by i_item
...