2013-04-21 66 views
1

假設我有一個表TBL1(C1,C2,C3)如何查詢存儲在不同表中的自定義排序順序?

C1-C2-C3
A - 2 - 6
N - 6 - 7
Ç - 9 - 4
ķ - 3 - 5

&另一個表OrderOfTbl1(C1,customOrder INT)

C1 - customOrder
的K - 1
N - 2
Ç - 3
A - 4

現在,我可以做TBL1 &結果所有排序查詢可以是任何順序
N - 6
A - 2
K - 3

那麼,如何使這個結果按OrderOfTbl1表中的順序排序呢?

我不想做這兩張表之間的連接,我更喜歡「按例排序...然後....」的解決方案,因爲它更自然。

回答

2

使用連接是您的最佳選擇。但是,如果你想避免加入明確的,你可以這樣做:

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

對於這項工作的前提是,裏面ORDER BYSELECT返回一個標量。

+0

您的查詢是完美的,它非常簡單和優雅。 Thax u非常多 – Tom 2013-04-21 03:22:02

+0

是的,orderoftbl1包含標量值 – Tom 2013-04-21 03:43:47

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。

+0

假設Tbl1加入了許多不同的表,如果我們使用解決方案1,那麼查詢很多很複雜 – Tom 2013-04-21 03:03:39

+0

我想要一個簡單的查詢,如「Select * from tbl1 order by(selectOn,orderOfTbl1中的customOrder)像那樣,但我不知道查詢 – Tom 2013-04-21 03:05:29

+0

如果你必須訂購很多領域:按c1,c2,c3.c4順序.... 那麼它會太複雜,如果你使用左加入 – Tom 2013-04-21 06:57:20