2015-09-16 4 views
0

У меня есть таблица с пользователями и таблица с кодами. У каждого пользователя есть 4 кода. Мне нужно вернуть 4 кода для пользователя с идентификатором 5234, но отсортировано в алфавитном порядке.Как сортировать результаты по алфавиту в столбцах

Как это:

SELECT 
    --results sorted alphabetically 
    <here_should_be 'aaa'> code1, 
    <here should be 'bbb'> code2, 
    <here should be 'ccc'> code3, 
    <here should be 'ddd'> code4 
FROM 
    user bt 
    LEFT JOIN table_with_codes value_1 ON (bt.rk_id = value_1.rk_id AND value_1.code = 'code_1') --assume value_1.string_value return 'bbb' 
    LEFT JOIN table_with_codes value_2 ON (bt.rk_id = value_2.rk_id AND value_2.code = 'code_2') --assume value_2.string_value return 'aaa' 
    LEFT JOIN table_with_codes value_3 ON (bt.rk_id = value_3.rk_id AND value_3.code = 'code_3') --assume value_3.string_value return 'ddd' 
    LEFT JOIN table_with_codes value_4 ON (bt.rk_id = value_4.rk_id AND value_4.code = 'code_4') --assume value_4.string_value return 'ccc' 
WHERE bt.id = 5234; 

Что лучший способ сделать это?

+1

почему вы это делаете? выглядит странно для меня, какая ситуация понадобится для такого типа? : \ – MrSimpleMind

+0

@MrSimpleMind, я редактировал свой пример. –

ответ

1

SQL Fiddle

Перед обновлением ОП - если эти 4 значения находятся в разных столбцах одной и той же строке той же таблицы: Setup

Oracle 11g R2 Схема:
Запрос 1:

WITH data (z1, z2, z3, z4) AS (
    SELECT 'bbb', 'aaa', 'ccc', 'ddd' FROM DUAL 
) 
SELECT LEAST(z1, z2, z3, z4) c1, 
     CASE WHEN z1 <= z2 AND z2 <= z3 AND z2 <= z4 THEN z2 
      WHEN z1 <= z3 AND z3 <= z2 AND z3 <= z4 THEN z3 
      WHEN z1 <= z4 AND z4 <= z2 AND z4 <= z3 THEN z4 
      WHEN z2 <= z1 AND z1 <= z3 AND z1 <= z4 THEN z1 
      WHEN z2 <= z3 AND z3 <= z1 AND z3 <= z4 THEN z3 
      WHEN z2 <= z4 AND z4 <= z1 AND z4 <= z3 THEN z4 
      WHEN z3 <= z1 AND z1 <= z2 AND z1 <= z4 THEN z1 
      WHEN z3 <= z2 AND z2 <= z1 AND z2 <= z4 THEN z2 
      WHEN z3 <= z4 AND z4 <= z1 AND z4 <= z2 THEN z4 
      WHEN z4 <= z1 AND z1 <= z3 AND z1 <= z4 THEN z1 
      WHEN z4 <= z2 AND z2 <= z1 AND z2 <= z3 THEN z2 
      WHEN z4 <= z3 AND z3 <= z1 AND z3 <= z2 THEN z3 END AS c2, 
     CASE WHEN z1 >= z2 AND z2 >= z3 AND z2 >= z4 THEN z2 
      WHEN z1 >= z3 AND z3 >= z2 AND z3 >= z4 THEN z3 
      WHEN z1 >= z4 AND z4 >= z2 AND z4 >= z3 THEN z4 
      WHEN z2 >= z1 AND z1 >= z3 AND z1 >= z4 THEN z1 
      WHEN z2 >= z3 AND z3 >= z1 AND z3 >= z4 THEN z3 
      WHEN z2 >= z4 AND z4 >= z1 AND z4 >= z3 THEN z4 
      WHEN z3 >= z1 AND z1 >= z2 AND z1 >= z4 THEN z1 
      WHEN z3 >= z2 AND z2 >= z1 AND z2 >= z4 THEN z2 
      WHEN z3 >= z4 AND z4 >= z1 AND z4 >= z2 THEN z4 
      WHEN z4 >= z1 AND z1 >= z3 AND z1 >= z4 THEN z1 
      WHEN z4 >= z2 AND z2 >= z1 AND z2 >= z3 THEN z2 
      WHEN z4 >= z3 AND z3 >= z1 AND z3 >= z2 THEN z3 END AS c3, 
     GREATEST(z1, z2, z3, z4) c4 
FROM data 

Results:

| C1 | C2 | C3 | C4 | 
|-----|-----|-----|-----| 
| aaa | bbb | ccc | ddd | 

После обновления ОП - если эти 4 значения находятся в разных строках одной таблицы:

SQL Fiddle

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

CREATE TABLE users (id, rk_id) AS 
SELECT 5234, 1 FROM DUAL; 

CREATE TABLE table_with_codes (rk_id, code, string_value) AS 
      SELECT 1, 'code1', 'bbb' FROM DUAL 
UNION ALL SELECT 1, 'code2', 'ddd' FROM DUAL 
UNION ALL SELECT 1, 'code3', 'aaa' FROM DUAL 
UNION ALL SELECT 1, 'code4', 'ccc' FROM DUAL; 

Запрос 2:

WITH ordered_codes (rk_id, idx, string_value) AS (
    SELECT rk_id, 
     ROW_NUMBER() OVER (PARTITION BY rk_id ORDER BY string_value), 
     string_value 
    FROM table_with_codes 
) 
SELECT u.id, 
     MAX(CASE idx WHEN 1 THEN string_value END) AS c1, 
     MAX(CASE idx WHEN 2 THEN string_value END) AS c2, 
     MAX(CASE idx WHEN 3 THEN string_value END) AS c3, 
     MAX(CASE idx WHEN 4 THEN string_value END) AS c4 
FROM users u 
     LEFT OUTER JOIN ordered_codes o 
     ON (u.rk_id = o.rk_id) 
WHERE u.id = 5234 
GROUP BY u.id 

Results:

| ID | C1 | C2 | C3 | C4 | 
|------|-----|-----|-----|-----| 
| 5234 | aaa | bbb | ccc | ddd | 
+1

OMG, этот код выглядит ужасно .. это лучший способ? ;> –

+0

Это зависит от того, как вы структурируете свои данные: если данные находятся в разных столбцах одной и той же строки, то да, это может выглядеть ужасно, но это лучший способ; однако, если данные находятся в разных строках (а не в столбцах), то см. мое обновление. – MT0

+0

И если данные структурированы как первый вариант, и вам нужно иметь дело с значениями «NULL», тогда он будет еще более запутанным. – MT0

Смежные вопросы