-2

我有一张桌子A。

|----+----|
| 磷 | 小号 |
|----+----|
| p1 | 1 |
| p2 | 7 |
| p3 | 14 |
| p4 | 23 |
| p5 | 1 |
|----+----|

和表 B

|----+----|
| 小号 | C |
|----+----|
| 1 | 21 |
| 5 | 21 |
| 23 | 21 |
| 1 | 30 |
| 7 | 90 |
|----+----|

我需要对表 A 进行排序。

排序顺序:

A. TableA.S 存在于 (TableA.S = TableB.S) 和 TableB.C = 21
B. 表 A.P

最终输出:

|----+----|
| 磷 | 小号 |
|----+----|
| p1 | 1 |
| p4 | 23 |
| p5 | 1 |
| p2 | 7 |
| p3 | 14 |
|----+----|

这需要转换为 DBIx::Class 查询。

我试过以下:

选择tableA.P、tableA.S
从 tableA 左连接 tableB 上 tableA.S = tableB.S
其中(tableB.C = 21 或 tableB.C 为 NULL)
按表 B.C、表 A.P 排序

但是我在某个地方找不到 tableB.S 为“7”的结果。

谢谢。

4

2 回答 2

3

这对 A 中的所有记录进行排序,A.P在 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>
于 2011-11-11T17:40:58.550 回答
3

您实际上可以避免使用CASE或相关的等价物(例如COALESCE(...)和特定于 db 的相关函数):

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

于 2011-11-11T17:41:39.470 回答