如何查询存储在不同表中的自定义排序顺序?

时间:2013-04-21 02:50:06

标签: sql

假设我有一个表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表中所述的订单?

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

2 个答案:

答案 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。