Сплит SQL результаты - PullRequest
0 голосов
/ 25 апреля 2018

У меня есть SQL-запрос, который проецирует несколько атрибутов:

SELECT a, b, c, d

Я хочу изменить форму результатов запроса, чтобы каждый результат был разбит на UNION из пар атрибутов, очень похоже на следующее:

SELECT a AS x, b AS y
UNION
SELECT b AS x, c AS y
UNION
SELECT c AS x, d AS y

Есть ли способ сделать это без переформулирования или повторения подзапроса, который проецирует a, b, c, d?

В частности, я ищу решение, которое работает на диалекте SQLиспользуется базой данных Oracle (версия 12).

Ответы [ 5 ]

0 голосов
/ 26 апреля 2018

Предложение WITH, предложенное GauravS , работает по мере необходимости:

WITH inner AS (
  SELECT a, b, c, d
  ...
)
SELECT a, b
FROM inner
UNION
SELECT b, c
FROM inner
UNION
SELECT c, d
FROM inner
0 голосов
/ 25 апреля 2018

Использование UNPIVOT:

SQL Fiddle

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

CREATE TABLE table_name ( a,b,c,d ) AS
  SELECT 'a', 'b', 'c', 'd' FROM DUAL;

Запрос 1 :

SELECT *
FROM   table_name
UNPIVOT( ( x, y ) FOR pair_index IN (
  ( a, b ) AS 1,
  ( b, c ) AS 2,
  ( c, d ) AS 3
) )

Результаты :

| PAIR_INDEX | X | Y |
|------------|---|---|
|          1 | a | b |
|          2 | b | c |
|          3 | c | d |
0 голосов
/ 25 апреля 2018
SQL> WITH test
  2       AS (SELECT 'a' a,
  3                  'b' b,
  4                  'c' c,
  5                  'd' d
  6             FROM DUAL),
  7       inter
  8       AS (SELECT ROWNUM rn, data, col
  9             FROM test UNPIVOT (col FOR data IN (a, b, c, d)))
 10  SELECT i1.col x, i2.col y
 11    FROM inter i1 JOIN inter i2 ON i2.rn = i1.rn + 1;

X Y
- -
a b
b c
c d

SQL>
0 голосов
/ 25 апреля 2018

Если вы согласны с тем, что все в одном столбце разделены запятой.

SELECT TRIM (both ',' FROM a ||',' ||b ||',' ||c ||',' ||d )  as sets
FROM   t 
GROUP  BY grouping sets( ( a, b ), ( b, c ), ( c, d ) ); 

| SETS |
|------|
|  4,5 |
|  1,2 |
|  2,3 |
|  5,6 |
|  3,4 |
|  6,7 |

демо

0 голосов
/ 25 апреля 2018
SELECT
  CASE 
    WHEN rowgen.n=1 THEN main.a
    WHEN rowgen.n=2 THEN main.b
    WHEN rowgen.n=3 THEN main.c
  END as x,
  CASE 
    WHEN rowgen.n=1 THEN main.b
    WHEN rowgen.n=2 THEN main.c
    WHEN rowgen.n=3 THEN main.d
  END as y
FROM (SELECT a, b, c, d) main, 
     (SELECT 1 as n
      UNION ALL
      SELECT 2 as n
      UNION ALL
      SELECT 3 as n) rowgen
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...