Запрос заказа данных по стране и городу для данного сценария - PullRequest
0 голосов
/ 06 июня 2018

Мои входные данные ниже:

**Country          city**
Australia     Sydney
Australia     melbourne
India         Delhi
India         Chennai
India         Bangalore
Afghanistan   Kabul

Ожидаемый результат:

Afghanistan
Kabul
Australia
melbourne
syndey
India
Bangalore
Chennai
Delhi

Данные в обоих столбцах должны быть расположены в алфавитном порядке (как на уровне города, так и на уровне страны) и результатдолжен быть один столбец с вышеуказанными значениями.Страна должна располагаться в алфавитном порядке, а соответствующие города должны располагаться под ними, что также должно быть в алфавитном порядке.Как это можно сделать без использования промежуточной таблицы в одном запросе?

Ответы [ 2 ]

0 голосов
/ 06 июня 2018

Это сканирование одной таблицы, а также не нужно использовать UNION для получения различных результатов:

SQL Fiddle

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

CREATE TABLE cities ( Country, city ) AS
SELECT 'Australia',     'Sydney' FROM DUAL UNION ALL
SELECT 'Australia',     'melbourne' FROM DUAL UNION ALL
SELECT 'India',         'Delhi' FROM DUAL UNION ALL
SELECT 'India',         'Chennai' FROM DUAL UNION ALL
SELECT 'India',         'Bangalore' FROM DUAL UNION ALL
SELECT 'Afghanistan',   'Kabul' FROM DUAL;

Запрос 1 :

SELECT value
FROM   (
  SELECT c.*,
         country AS ctry,
         ROW_NUMBER() OVER ( PARTITION BY Country ORDER BY city ) AS rn
  FROM   cities c
)
UNPIVOT( value FOR key IN ( Country AS 1, City AS 2 ) )
WHERE rn = 1 OR key = 2
ORDER BY ctry, rn, key

Результаты :

|       VALUE |
|-------------|
| Afghanistan |
|       Kabul |
|   Australia |
|      Sydney |
|   melbourne |
|       India |
|   Bangalore |
|     Chennai |
|       Delhi |
0 голосов
/ 06 июня 2018

Вам нужен запрос UNION ALL, чтобы получить одну строку на страну и одну строку на город в вашем результате:

select coalesce(city, country) as location
from
(
  select distinct country, null as city from mytable
  union all
  select country, city from mytable
)
order by country, city nulls first;
...