Truy vấn SQL - Sử dụng Thứ tự Theo trong UNION


83

Làm cách nào để có thể sắp xếp theo chương trình một truy vấn liên hợp khi lấy dữ liệu từ hai bảng? Ví dụ,

SELECT table1.field1 FROM table1 ORDER BY table1.field1
UNION
SELECT table2.field1 FROM table2 ORDER BY table2.field1

Ném một ngoại lệ

Lưu ý: điều này đang được thực hiện trên công cụ cơ sở dữ liệu MS Access Jet

Câu trả lời:


118

Đôi khi bạn cần phải có ORDER BYtrong mỗi phần cần được kết hợp với UNION.

Trong trường hợp này

SELECT * FROM 
(
  SELECT table1.field1 FROM table1 ORDER BY table1.field1
) DUMMY_ALIAS1

UNION ALL

SELECT * FROM
( 
  SELECT table2.field1 FROM table2 ORDER BY table2.field1
) DUMMY_ALIAS2

1
đã làm việc cho tôi khi thứ tự theo ảnh hưởng đến tập kết quả (như khi sử dụng Top x)
James Barrass

Đây chính xác là những gì tôi đang tìm kiếm! Cảm ơn!
Srichand Yella

Hoạt động tốt đối với tôi ... bạn cần đảm bảo rằng lựa chọn bên ngoài có bí danh bảng. Nó cắn tôi.
Troy

Tôi không gặp sự cố nào khi sử dụng cú pháp này với Microsoft SQL Server Standard (64-bit) phiên bản 11.0.5058.0.
hlovdal

3
Trong SSMS, bạn sẽ cần phải thay đổi các truy vấn phụ thành SELECT TOP 100 PERCENTđể sử dụng ORDER BYtrong một truy vấn phụ
Joseph Nields

64
SELECT field1 FROM table1
UNION
SELECT field1 FROM table2
ORDER BY field1

18
Về mặt kỹ thuật, điều này không hoàn thành những gì bạn đã hỏi một cách hợp lý trong câu hỏi ban đầu.
Ian Boyd

2
@Ian Boyd: Tôi hiểu quan điểm của bạn nhưng những gì họ đang hỏi không có ý nghĩa logic: công đoàn hoạt động trên các bộ và các bộ không có thứ tự!
onedaywhen

8
@onedaywhen Tác giả ban đầu muốn nối hai bộ kết quả có thứ tự. UNIONkhông cho phép điều đó xảy ra. Có thể có một cấu trúc khác để làm điều đó. Có thể không. Dù bằng cách nào thì câu trả lời này không hoàn thành về mặt kỹ thuật những gì tác giả yêu cầu.
Ian Boyd

4
@Ian Boyd: Trong SQL, ORDER BYlà một phần của con trỏ, trong khi UNIONhoạt động trên các bảng, do đó mã của chúng không thể hoạt động. Tôi không thể thấy làm thế nào bạn có thể suy ra ý định của OP từ mã vô lý. Hãy xem xét rằng SQL's UNIONloại bỏ các bản sao: nếu đây là "bộ kết quả được sắp xếp theo thứ tự" của bạn {1, 2, 3} UNION {2, 4, 6}thì kết quả sẽ là {1, 2, 3, 4, 6}hay {1, 3, 2, 4, 6}? Chúng tôi không biết vì liên hiệp "tập hợp kết quả có thứ tự" không được xác định liên quan đến SQL và OP chưa chỉ định.
onedaywhen

Tôi đang sử dụng MYSQL, tôi đã bao gồm trường (trường Đặt hàng) trong tất cả các câu lệnh chọn. Sau đó, chỉ cần thêm Đặt hàng bởi ở cuối, Hoạt động tốt cho tôi.
CreativeManix

57

Tôi nghĩ rằng điều này làm tốt công việc giải thích.

Sau đây là một truy vấn UNION sử dụng mệnh đề ORDER BY:

select supplier_id, supplier_name
from suppliers
where supplier_id > 2000
UNION
select company_id, company_name
from companies
where company_id > 1000
ORDER BY 2;

Vì tên cột khác nhau giữa hai câu lệnh "select", nên thuận lợi hơn khi tham chiếu các cột trong mệnh đề ORDER BY theo vị trí của chúng trong tập kết quả.

Trong ví dụ này, chúng tôi đã sắp xếp các kết quả theo supplier_name/ company_nametheo thứ tự tăng dần, như được biểu thị bằng "ORDER BY 2".

Các trường supplier_name/ company_namenằm ở vị trí số 2 trong tập kết quả.

Lấy từ đây: http://www.techonthenet.com/sql/union.php


28

Sử dụng một ví dụ cụ thể:

SELECT name FROM Folders ORDER BY name
UNION
SELECT name FROM Files ORDER BY name

Các tập tin:

name
=============================
RTS.exe
thiny1.etl
thing2.elt
f.txt
tcpdump_trial_license (1).zip

Thư mục:

name
============================
Contacts
Desktop
Downloads
Links
Favorites
My Documents

Đầu ra mong muốn: (kết quả của lần chọn đầu tiên trước, tức là trước tiên các thư mục)

Contacts
Desktop
Downloads
Favorites
Links
My Documents
f.txt
RTMS.exe
tcpdump_trial_license (1).zip
thiny1.etl
thing2.elt

SQL để đạt được kết quả mong muốn:

SELECT name 
FROM (
    SELECT 1 AS rank, name FROM Folders
    UNION 
    SELECT 2 AS rank, name FROM Files) dt
ORDER BY rank, name

3
Đây là câu trả lời tốt nhất cho đến nay
javier_domenech

1
Đây là câu trả lời TUYỆT VỜI!
Ali Gonabadi

Lưu ý - bạn phải đặt bí danh cho bảng dẫn xuất (như trong ví dụ này với dt) nếu không nó sẽ không hoạt động. Tôi đã hơi bối rối vì điều này vì tôi đã bỏ qua chi tiết đó để bắt đầu và thông báo lỗi do SSMS ném ra không đặc biệt hữu ích.
CactusCake

17

Đây là một ví dụ từ Northwind 2007:

SELECT [Product ID], [Order Date], [Company Name], [Transaction], [Quantity]
FROM [Product Orders]
UNION SELECT [Product ID], [Creation Date], [Company Name], [Transaction], [Quantity]
FROM [Product Purchases]
ORDER BY [Order Date] DESC;

Mệnh đề ORDER BY chỉ cần là câu lệnh cuối cùng, sau khi bạn đã hoàn thành tất cả các hợp nhất của mình. Bạn có thể kết hợp nhiều nhóm với nhau, sau đó đặt mệnh đề ORDER BY sau nhóm cuối cùng.


9
(SELECT table1.field1 FROM table1 
UNION
SELECT table2.field1 FROM table2) ORDER BY field1 

Công việc? Hãy nhớ bộ suy nghĩ. Nhận bộ bạn muốn bằng cách sử dụng một công đoàn và sau đó thực hiện các thao tác của bạn trên nó.


Bạn cũng có thể sử dụng các giá trị thứ tự theo thứ tự của bạn bằng cách điều khoản trong trường hợp các lĩnh vực bạn muốn sắp xếp trên được đặt tên khác nhau
Anson Smith

5
SELECT table1Column1 as col1,table1Column2 as col2
    FROM table1
UNION
(    SELECT table2Column1 as col1, table1Column2 as col2
         FROM table2
)
ORDER BY col1 ASC

4
SELECT field1
FROM ( SELECT field1 FROM table1
       UNION
       SELECT field1 FROM table2
     ) AS TBL
ORDER BY TBL.field1

(sử dụng ALIAS)


@DisplacedGuy nếu MJ có một câu trả lời tốt hơn cho một câu hỏi rồi sau đó bất kỳ ở trên, và trong trường hợp này là câu trả lời được chấp nhận có vấn đề rõ ràng, sau đó MJ sẽ có thể và tôi khuyến khích anh ta để lại câu trả lời mới
MobileMon

Và btw, câu trả lời của MJ là tốt nhất! (đối với tôi ít nhất)
MobileMon

4

Đây là điều ngu ngốc nhất mà tôi từng thấy, nhưng nó hoạt động, và bạn không thể tranh cãi về kết quả.

SELECT *
FROM (
    SELECT table1.field1 FROM table1 ORDER BY table1.field1
    UNION
    SELECT table2.field1 FROM table2 ORDER BY table2.field1
) derivedTable

Nội thất của bảng dẫn xuất sẽ không tự thực thi, nhưng vì bảng dẫn xuất hoạt động hoàn toàn tốt. Tôi đã thử điều này trên SS 2000, SS 2005, SS 2008 R2 và cả ba đều hoạt động.


2

đây là cách nó được thực hiện

select * from 
    (select top 100 percent pointx, pointy from point
     where pointtype = 1
     order by pointy) A
union all
select * from 
    (select top 100 percent pointx, pointy from point
     where pointtype = 2
     order by pointy desc) B

2

Duyệt qua phần bình luận này, tôi đã tìm thấy hai mẫu khác nhau trả lời câu hỏi. Đáng tiếc cho SQL 2012, mẫu thứ hai không hoạt động, vì vậy đây là "công việc xung quanh" của tôi


Đặt hàng theo một cột chung

Đây là trường hợp dễ gặp nhất mà bạn có thể gặp phải. Giống như nhiều người dùng đã chỉ ra, tất cả những gì bạn thực sự cần làm là thêm dấu Order Byvào cuối truy vấn

SELECT a FROM table1
UNION
SELECT a FROM table2
ORDER BY field1

hoặc là

SELECT a FROM table1 ORDER BY field1
UNION
SELECT a FROM table2 ORDER BY field1

Đặt hàng theo các cột khác nhau

Đây là nơi mà nó thực sự trở nên khó khăn. Sử dụng SQL 2012, tôi đã thử bài đăng hàng đầu và nó không hoạt động.

SELECT * FROM 
(
  SELECT table1.field1 FROM table1 ORDER BY table1.field1
) DUMMY_ALIAS1

UNION ALL

SELECT * FROM
( 
  SELECT table2.field1 FROM table2 ORDER BY table2.field1
) DUMMY_ALIAS2

Sau lời nhắc nhở trong nhận xét, tôi đã thử điều này

SELECT * FROM 
(
  SELECT TOP 100 PERCENT table1.field1 FROM table1 ORDER BY table1.field1
) DUMMY_ALIAS1

UNION ALL

SELECT * FROM
( 
  SELECT TOP 100 PERCENT table2.field1 FROM table2 ORDER BY table2.field1
) DUMMY_ALIAS2

Mã này đã biên dịch nhưng DUMMY_ALIAS1DUMMY_ALIAS2ghi đè lên đã Order Bythiết lập trong Selectcâu lệnh khiến điều này không thể sử dụng được.

Giải pháp duy nhất mà tôi có thể nghĩ ra, phù hợp với tôi là không sử dụng liên hợp và thay vào đó làm cho các truy vấn chạy riêng lẻ và sau đó xử lý chúng. Vì vậy, về cơ bản, không sử dụng Unionkhi bạn muốnOrder By


1

Bằng cách sử dụng thứ tự riêng biệt, mỗi tập hợp con nhận được thứ tự, nhưng không phải toàn bộ tập hợp, đó là những gì bạn muốn hợp nhất hai bảng.

Bạn nên sử dụng một cái gì đó như thế này để có một bộ có thứ tự:

SELECT TOP (100) PERCENT field1, field2, field3, field4, field5 FROM 
(SELECT table1.field1, table1.field2, table1.field3, table1.field4, table1.field5 FROM table1
UNION ALL 
SELECT table2.field1, table2.field2, table2.field3, table2.field4, table2.field5 FROM  table2) 
AS unitedTables ORDER BY field5 DESC

0

Bảng thứ hai không được bao gồm tên bảng trong ORDER BYmệnh đề.

Vì thế...

SELECT table1.field1 FROM table1 ORDER BY table1.field1
UNION
SELECT table2.field1 FROM table2 ORDER BY field1

Không ném một ngoại lệ


Đây là một câu hỏi hay. Bạn có thể biết liệu phiên bản của bạn, hay phiên bản lồng nhau, có trả lại kết quả mong muốn không? Hoặc, cả hai đều trả về cùng một kết quả? Nếu vậy, giải pháp lồng nhau (của người khác) có hiệu quả hơn không vì nó chỉ ĐẶT HÀNG BẰNG MỘT lần?
DOK 17/10/08

Tôi không chắc lợi ích về hiệu suất trên động cơ phản lực, nhưng tôi có thể nói rằng khả năng đọc được tăng lên do lồng vào nhau.
Curtis Inderwiesche 17/10/08

0

Nếu cần thiết để giữ phân loại bên trong:

SELECT 1 as type, field1 FROM table1 
UNION 
SELECT 2 as type, field1 FROM table2 
ORDER BY type, field1

0
(SELECT FIELD1 AS NEWFIELD FROM TABLE1 ORDER BY FIELD1)
UNION
(SELECT FIELD2 FROM TABLE2 ORDER BY FIELD2)
UNION
(SELECT FIELD3 FROM TABLE3 ORDER BY FIELD3) ORDER BY NEWFIELD

Thử đi. Nó đã làm việc cho tôi.


0

Đối với Sql Server 2014/2012 / Khác (Không được Kiểm tra):

SELECT * FROM 
(
  SELECT table1.field1 FROM table1 ORDER BY table1.field1
) 
as DUMMY_ALIAS1

UNION ALL

SELECT * FROM
( 
  SELECT table2.field1 FROM table2 ORDER BY table2.field1
) 
as DUMMY_ALIAS2

Bạn gặp lỗi biên dịch vào năm 2012 khi thử lỗi này. Tập lệnh sẽ không hoạt động đối với một thủ tục được lưu trữ. Bạn cần mệnh đề hàng đầu.
Timothy Dooling
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.