Сортировка таблицы по другой таблице - PullRequest
0 голосов
/ 11 ноября 2011

У меня есть стол А.

|----+----|
| P  |  S |
|----+----|
| p1 |  1 |
| p2 |  7 |
| p3 | 14 |
| p4 | 23 |
| p5 |  1 |
|----+----|

и таблица B

|----+----|
|  S |  C |
|----+----|
|  1 | 21 |
|  5 | 21 |
| 23 | 21 |
|  1 | 30 |
|  7 | 90 |
|----+----|

Мне нужно отсортировать таблицу A.

Порядок сортировки:

A. TableA.S exists where  (TableA.S = TableB.S) and TableB.C = 21
B. TableA.P

Окончательный вывод:

|----+----|
| P  |  S |
|----+----|
| p1 |  1 |
| p4 | 23 |
| p5 |  1 |
| p2 |  7 |
| p3 | 14 |
|----+----|

Это необходимо преобразовать в запрос DBIx :: Class.

Я попробовал следующее:

Select tableA.P, tableA.S
from tableA left join tableB on tableA.S = tableB.S
where (tableB.C = 21 or tableB.C is NULL)
order by tableB.C, tableA.P

Но мне не хватает где-то результата, где tableB.S = 7.

Спасибо.

Ответы [ 2 ]

3 голосов
/ 11 ноября 2011

На самом деле вы можете избежать использования CASE или связанных с ним эквивалентов (таких как COALESCE(...) и связанных с БД функций):

SELECT TableA.p, TableA.s
FROM TableA
LEFT JOIN TableB
       ON TableA.s = TableB.s
          AND TableB.c = 21
ORDER BY TableB.c, TableA.p

Почему это работает?Поведение Oracle по умолчанию (и некоторых других БД) заключается в том, что null сортирует как «наибольшее» значение (некоторые считают его «самым низким» значением, которое в этом случае было бы тривиально исправить).Итак, сначала приводятся строки со значением в данном столбце (которое является постоянным значением), а затем строки без ...

3 голосов
/ 11 ноября 2011

Это сортирует по A.P для всех записей в A, соответствующая запись находится в B, а затем A.P для других записей.

 SQL> select A.P
       , A.S
from A 
     left join B        
        on ( A.S = B.S 
             and B.C = 21)
order by nvl2(B.S, 'ZZZZZZZZZZ', A.P), A.P
/

  2    3    4    5    6    7    8  
P           S
-- ----------
p1          1
p4         23
p5          1
p2          7
p3         14

SQL>
...