1

假设我有一张表 Tbl1 (C1, C2, C3)

C1-C2-C3
A - 2 - 6
N - 6 - 7
C - 9 - 4
K - 3 - 5

& 另一个表 OrderOfTbl1 (C1, customOrder int)

C1 - 定制订单
K - 1
N - 2
C - 3
A - 4

现在,我可以对 Tbl1 进行各种查询,结果可以是任意顺序
N - 6
A - 2
K - 3

那么,如何让这个结果按照 OrderOfTbl1 表中的 Order 排序呢?

我不想在这两个表之间进行联接,我更喜欢“按案例排序......然后......”解决方案,因为它更自然。

4

2 回答 2

2

使用联接是您的最佳选择。但是,如果您想避免显式加入,可以这样做:

SELECT t.*
FROM table1 t
ORDER BY (SELECT customOrder FROM orderoftbl1 ot WHERE t.c1 = ot.c1)

这个工作的要求是SELECT内部ORDER BY返回一个标量。

于 2013-04-21T03:02:24.103 回答
1

正确的方法是使用连接:

select t.*
from table1 t left outer join
     orderoftbl1 ot
     on t1.c1 = ot.c1
order by ot.customerOrder

当您有常量时,您可以使用case语句:

select *
from table1
order by (case when c1 = 'K' then 1
               when c1 = 'N' then 2
               . . .
          end)

但这违背了拥有另一张桌子的目的。

您所说的“解决方案,因为它更自然”是什么意思?是什么让一个 SQL 语句比另一个“更自然”?

您可以使用order by子句中的相关子查询来做您想做的事情:

select *
from table1 t1
order by (select customerOrder from orderoftbl1 ot where ot.c1 = t1.c1)

然而,几乎没有人会认为这比带有join. 事实上,有些数据库可能不支持order by子句中的相关子查询。在这个答案之前,我当然从来没有写过这样的 SQL。

于 2013-04-21T02:55:15.370 回答