根据另一个表对表进行排序

时间:2011-11-11 17:05:41

标签: sql perl oracle dbix-class

我有一张桌子。

|----+----|
| 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 个答案:

答案 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将“最大”值排序(有些人认为它是“最低”值,在这种情况下修复这将是微不足道的)。因此给出了给定列中具有值的第一行(这是一个常量值),然后是那些没有...

的行