假设我有一个表Tbl1(C1,C2,C3)
C1-C2-C3
A - 2 - 6
N - 6 - 7
C - 9 - 4
K - 3 - 5
&安培;另一个表OrderOfTbl1(C1,customOrder int)
C1 - customOrder
K - 1
N - 2
C - 3
A - 4
现在,我可以对Tbl1&amp ;;进行各种查询。结果可以是任何订单
N - 6
A - 2
K - 3
那么,如何将此结果排序为OrderOfTbl1表中所述的订单?
我不想在这两个表之间进行连接,我更喜欢“按案例排序......然后......”解决方案,因为它更自然。
答案 0 :(得分:2)
使用联接是您的最佳选择。但是,如果要避免明确加入,可以执行以下操作:
SELECT t.*
FROM table1 t
ORDER BY (SELECT customOrder FROM orderoftbl1 ot WHERE t.c1 = ot.c1)
要求这项工作的要求是SELECT
内的ORDER BY
返回了一个标量。
答案 1 :(得分: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。