我在C#和Java中都實現了一個應用程序,並希望具有類似於SQL中的ORDER BY功能的功能。但是,要做到這一點,我必須瞭解排列多列的概念。多列排序的目的是什麼?
我試圖寫一個簡單的SQL語句,如
SELECT * FROM TABLE ORDER BY Field1,Field2
。
在這樣做時,只訂購了Field1
。實際上是否有任何用於指定多列的用途?
我在C#和Java中都實現了一個應用程序,並希望具有類似於SQL中的ORDER BY功能的功能。但是,要做到這一點,我必須瞭解排列多列的概念。多列排序的目的是什麼?
我試圖寫一個簡單的SQL語句,如
SELECT * FROM TABLE ORDER BY Field1,Field2
。
在這樣做時,只訂購了Field1
。實際上是否有任何用於指定多列的用途?
考慮一下:如果Field1
行值相等怎麼辦?
Basicaly,在你的榜樣,你首先爲了通過Field1
,如果值相等,你排序Field2
例子:
Field1 | Field2
A 4
B 1
A 3
order by Field1, Field2
:
Field1 | Field2
A 3
A 4
B 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
列對其排序。
感謝您的解釋。如果您從不同的連接表中按2列排序,會發生什麼情況? – 2013-02-16 10:50:00
@DotNET想想那樣;只需從查詢中刪除使用連接表的'order by'部分即可。在那之後,你可以按順序添加'order by'部分哪個表格'列。 – 2013-02-16 10:55:45
感謝您的回答! +1 – 2013-02-16 11:01:41
如果有與Field1
相同值的多個行,他們將在內部對Field2
下令:
Field1 | Field2
-------+--------
1 | 243
2 | 23
2 | 42
2 | 278
3 | 1
說表是「人」,字段1是「姓氏」(姓)和Field2是「first_name」(給定名稱),那麼共用「Smith」姓的三個人將會應用第二名的第一名。
Smith Tim
Picard Bernard
Smith Alice
Smith Bob
成爲...
Picard Bernard
Smith Alice
Smith Bob
Smith Tim
正如有人說,連續排序字段進來時,之前排序字段遭遇重複值的發揮。
如果您在ORDER子句中指定了多個列,它會按第一個,然後是第二個,然後是第三個等等進行排序。例如,如果您通過Forename,Surname進行訂購,結果將首先按Forename排序,即所有A的第一個,然後是Surname,因此每個A都將按其姓氏排序,因此如果您有兩個Albert在您身邊數據顯示在您未排序表中愛因斯坦和阿爾伯特·戴維斯的順序,他們將出現在列表中通過自己的姓氏的順序,即
Forename | Surname
Albert | Davies
Albert | Einstein
Arthur | Dent
如果你只是爲了用的名字,你會得到以下(當然,愛因斯坦出現上述戴維斯在未排序表)提供:
Forename | Surname
Albert | Einstein
Albert | Davies
Arthur | Dent
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
*/
如果來自ORDER BY的列來自同一個表或者它們來自兩個或多個表,那麼無關緊要。重要的是'ORDER BY'子句的位置:如果您需要排序結果,那麼您需要在最終查詢中使用ORDER BY(在子查詢或派生表內使用'ORDER BY'保證排序結果)。 – 2013-02-16 11:03:46
感謝您的解釋! +1 – 2013-02-16 11:10:15
其實我已經在線閱讀,但我不確定自己理解100%。因此,這個問題。你能否詳細說明一下? – 2013-02-16 10:39:27
我在回答中提供了示例 – Zbigniew 2013-02-16 10:39:51
好吧,我想我已經明白了! :)感謝這個偉大的例子。 +1 – 2013-02-16 10:40:33