我有一张桌子。
|----+----| | 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'。
感谢。
答案 0 :(得分:3)
按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>
答案 1 :(得分:3)
您实际上可以避免使用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(以及其他一些dbs)的默认行为是null
将“最大”值排序(有些人认为它是“最低”值,在这种情况下修复这将是微不足道的)。因此给出了给定列中具有值的第一行(这是一个常量值),然后是那些没有...