2013-02-16 24 views
1

我在C#和Java中都實現了一個應用程序,並希望具有類似於SQL中的ORDER BY功能的功能。但是,要做到這一點,我必須瞭解排列多列的概念。多列排序的目的是什麼?

我試圖寫一個簡單的SQL語句,如

SELECT * FROM TABLE ORDER BY Field1,Field2

在這樣做時,只訂購了Field1。實際上是否有任何用於指定多列的用途?

回答

4

考慮一下:如果Field1行值相等怎麼辦?

Basicaly,在你的榜樣,你首先爲了通過Field1,如果值相等,你排序Field2

例子:

Field1 | Field2 
A  4 
B  1 
A  3 

order by Field1, Field2

Field1 | Field2 
A  3 
A  4 
B  1 
+0

其實我已經在線閱讀,但我不確定自己理解100%。因此,這個問題。你能否詳細說明一下? – 2013-02-16 10:39:27

+0

我在回答中提供了示例 – Zbigniew 2013-02-16 10:39:51

+0

好吧,我想我已經明白了! :)感謝這個偉大的例子。 +1 – 2013-02-16 10:40:33

1

在這樣做,只有Field1被訂購。

否。第二列用於第一列值相等時的排序。

讓我們考慮一下創建一個這樣的表;

CREATE TABLE tbl 
    ([Field1] varchar(1), [Field2] int) 
; 

INSERT INTO tbl 
    ([Field1], [Field2]) 
VALUES 
    ('A', 1), 
    ('A', 2), 
    ('B', 1), 
    ('B', 2), 
    ('C', 4), 
    ('C', 2), 
    ('C', 1) 
; 

當你運行這個query;

Select * 
From tbl 
Order by Field1 

它給你結果

FIELD1 FIELD2 
A 1 
A 2 
B 1 
B 2 
C 4 
C 2 
C 1 

,因爲我們爲了它只是基於Field1這是正常的。它不關心其他專欄的任何內容。

但是,當你運行這個query;

Select * 
From tbl 
Order by Field1, Field2 

這給你結果

FIELD1 FIELD2 
A 1 
A 2 
B 1 
B 2 
C 1 
C 2 
C 4 

這是正常的,因爲我們說要查詢;首先,根據Field1列值對結果進行排序,如果某些Field1值相等,則根據Field2列對其排序。

+0

感謝您的解釋。如果您從不同的連接表中按2列排序,會發生什麼情況? – 2013-02-16 10:50:00

+0

@DotNET想想那樣;只需從查詢中刪除使用連接表的'order by'部分即可。在那之後,你可以按順序添加'order by'部分哪個表格'列。 – 2013-02-16 10:55:45

+1

感謝您的回答! +1 – 2013-02-16 11:01:41

0

如果有與Field1相同值的多個行,他們將在內部對Field2下令:

Field1 | Field2 
-------+-------- 
1  | 243 
2  | 23 
2  | 42 
2  | 278 
3  | 1 
0

說表是「人」,字段1是「姓氏」(姓)和Field2是「first_name」(給定名稱),那麼共用「Smith」姓的三個人將會應用第二名的第一名。

Smith Tim 
Picard Bernard 
Smith Alice 
Smith Bob 

成爲...

Picard Bernard 
Smith Alice 
Smith Bob 
Smith Tim 

正如有人說,連續排序字段進來時,之前排序字段遭遇重複值的發揮。

0

如果您在ORDER子句中指定了多個列,它會按第一個,然後是第二個,然後是第三個等等進行排序。例如,如果您通過Forename,Surname進行訂購,結果將首先按Forename排序,即所有A的第一個,然後是Surname,因此每個A都將按其姓氏排序,因此如果您有兩個Albert在您身邊數據顯示在您未排序表中愛因斯坦和阿爾伯特·戴維斯的順序,他們將出現在列表中通過自己的姓氏的順序,即

Forename | Surname 
Albert  | Davies 
Albert  | Einstein 
Arthur  | Dent 

如果你只是爲了用的名字,你會得到以下(當然,愛因斯坦出現上述戴維斯在未排序表)提供:

Forename | Surname 
Albert  | Einstein 
Albert  | Davies 
Arthur  | Dent 
1
DECLARE @CocoJambo TABLE (
    ID INT IDENTITY PRIMARY KEY, 
    FirstName NVARCHAR(50) NOT NULL, 
    LastName NVARCHAR(50) NOT NULL 
); 

INSERT @CocoJambo 
     (FirstName, LastName) 
SELECT 'Mary', 'SMITH' 
UNION ALL SELECT 'John', 'WILLIAMS' 
UNION ALL SELECT 'Alan', 'WILLIAMS' 
UNION ALL SELECT 'David', 'WILLIAMS' 
UNION ALL SELECT 'Erika', 'BROWN'; 


SELECT * 
FROM @CocoJambo a 
ORDER BY a.LastName; 
-- Persons are ordered only by last name but not by first name 
-- Look at John W., Alan W., David W. 
/* 
ID FirstName LastName 
-- --------- -------- 
5 Erika  BROWN 
1 Mary  SMITH 
2 John  WILLIAMS 
3 Alan  WILLIAMS 
4 David  WILLIAMS 
*/ 

SELECT * 
FROM @CocoJambo a 
ORDER BY a.LastName, a.FirstName; 
-- Persons are ordered by last name and (then by) first name  
-- Look at Alan W., David W., John W. 
/* 
ID FirstName LastName 
-- --------- -------- 
5 Erika  BROWN 
1 Mary  SMITH 
3 Alan  WILLIAMS 
4 David  WILLIAMS 
2 John  WILLIAMS 
*/ 
+0

如果來自ORDER BY的列來自同一個表或者它們來自兩個或多個表,那麼無關緊要。重要的是'ORDER BY'子句的位置:如果您需要排序結果,那麼您需要在最終查詢中使用ORDER BY(在子查詢或派生表內使用'ORDER BY'保證排序結果)。 – 2013-02-16 11:03:46

+0

感謝您的解釋! +1 – 2013-02-16 11:10:15

相關問題