2012-01-18 32 views
6

Tôi có một bảng: abc_test với các cột n_num, k_str.Sử dụng riêng biệt trên một cột và làm theo thứ tự trên một cột khác đưa ra một lỗi

này truy vấn doesnt work:

select distinct(n_num) from abc_test order by(k_str) 

Nhưng, lần này hoạt động:

select n_num from abc_test order by(k_str) 

Làm thế nào để DISTINCT và ORDER BY từ khóa hoạt động trong nội bộ mà sản lượng của cả các truy vấn được thay đổi?

+2

bạn có thể hiển thị kết quả nếu bạn chạy hai truy vấn? Truy vấn đầu tiên sẽ trả về lỗi 'ORA-01791: không phải là biểu thức được chọn' vì cột' k_str' không được chọn. Đây có phải là truy vấn thực tế bạn đã chạy không? (Nó có thể chấp nhận được trong 9i, nhưng tôi không thể chắc chắn.) –

+0

Cùng có hiệu lực trên SQL Server nhưng với một thông báo lỗi mô tả hơn, "ORDER BY mục phải xuất hiện trong danh sách chọn nếu SELECT DISTINCT được chỉ định." – onedaywhen

Trả lời

10

Theo như tôi hiểu từ câu hỏi của bạn.

riêng biệt: - có nghĩa là chọn riêng biệt (tất cả các giá trị được chọn phải là duy nhất). order By: - đơn giản là đặt hàng các hàng đã chọn theo yêu cầu của bạn.

Các vấn đề trong truy vấn đầu tiên của bạn là Ví dụ: Tôi có một bảng

ID name 
01 a 
02 b 
03 c 
04 d 
04 a 

nay là truy vấn select distinct(ID) from table order by (name) được nhầm lẫn mà kỷ lục nó nên đưa cho ID - 04 (kể từ khi hai giá trị đang có, d và trong cột Tên). Vì vậy, vấn đề cho động cơ DB là ở đây khi bạn nói đặt hàng theo (tên) .........

0

Bạn đang chọn bộ sưu tập riêng biệt (n_num) từ resultset từ truy vấn của mình. Vì vậy, không có mối quan hệ thực sự với cột k_str nữa. Một n_num có thể từ hai hàng, mỗi hàng có một giá trị khác nhau cho k_str. Vì vậy, bạn không thể yêu cầu bộ sưu tập riêng biệt (n_num) bởi k_str.

3

Truy vấn đầu tiên là không thể. Hãy giải thích điều này bằng ví dụ. chúng tôi có bài kiểm tra này:

n_num k_str 
2  a 
2  c 
1  b 

select distinct (n_num) from abc_test

2 
1 

Select n_num from abc_test order by k_str

2 
1 
2 

Những gì bạn muốn quay trở lại

select distinct (n_num) from abc_test order by k_str?

chỉ nên trả lại 1 và 2, nhưng cách đặt hàng?

+0

làm thế nào về điều này? 'select distinct (n_num) là iresult từ abc_test ORDER BY iresult ASC' –

+0

Chắc chắn anh ta có thể đặt hàng theo cột đầu tiên. OP là về lý do tại sao truy vấn này sẽ không hoạt động. Những gì bạn nói có thể đơn giản: 'chọn riêng biệt n_num từ abc_test thứ tự bằng 1' –

+0

" làm thế nào để đặt hàng chúng? " - Tôi có thể nghĩ về các cách tiếp cận có thể có: tất cả tùy ý; sắp xếp các giá trị rõ ràng theo thứ tự rồi các giá trị mơ hồ tùy ý; vv Nhưng tôi khá nghi ngờ bạn đã làm cho một điểm bị mất trên tôi! – onedaywhen

4

Bạn có thể nghĩ về việc sử dụng nhóm bởi thay vì:

select n_num 
from abc_test 
group by n_num 
order by min(k_str) 
+0

sẽ không hoạt động. k_str không thể chọn được. –

+0

@FlorinGhita Ý bạn là gì? Tôi vừa thử truy vấn, và với tôi có vẻ như nó đang hoạt động. –

+1

heeeei, bạn đã chỉnh sửa câu hỏi của mình. 'order by min (k_str)' là một thứ khác mà 'order by k_str' –

-1

bạn đã thử này?

SELECT DISTINCT n_num as iResult 
FROM abc_test 
ORDER BY iResult 
+0

xem ví dụ trong câu trả lời của tôi. Bạn muốn trả lại truy vấn của mình là gì? –

0

Theo tiêu chuẩn SQL, một điều khoản SELECT có thể tham khảo một trong hai là khoản ("bí danh") trong top mức SELECT khoản hoặc cột của resultset bởi vị trí thứ tự, và do đó nether các truy vấn của bạn sẽ là phù hợp .

Có vẻ như Oracle, nói chung với các triển khai SQL khác, cho phép bạn tham chiếu đến các cột đã tồn tại (hợp lý) ngay trước khi được chiếu đi trong mệnh đề SELECT. Tôi không chắc liệu sự linh hoạt như vậy có phải là một điều tốt hay không: IMO là cách thực hành tốt để vạch ra thứ tự sắp xếp cho ứng dụng gọi điện bằng cách bao gồm cột/biểu thức, v.v. trong mệnh đề SELECT.

Như mọi khi, bạn cần áp dụng dsicpline để nhận kết quả có ý nghĩa. Đối với truy vấn đầu tiên của bạn, định nghĩa về thứ tự có khả năng hoàn toàn tùy ý.Bạn nên biết ơn lỗi này;)

0

Phương pháp này có sẵn trong SQL Server 2000, bạn có thể chọn các giá trị khác biệt từ bảng và thứ tự theo cột khác không được bao gồm trong Phân biệt. Nhưng trong SQL 2012 điều này sẽ thông qua bạn một lỗi "ORDER BY mục phải xuất hiện trong danh sách lựa chọn nếu CHỌN DISTINCT được chỉ định."

Vì vậy, vẫn còn nếu bạn muốn sử dụng cùng một tính năng như của SQL 2000 bạn có thể sử dụng số cột để đặt hàng (nó không được khuyến cáo trong thực hành tốt nhất).

select distinct(n_num) from abc_test order by 1 

Điều này sẽ đặt cột đầu tiên sau khi tìm nạp kết quả. Nếu bạn muốn đặt hàng nên được thực hiện dựa trên cột khác nhau khác biệt hơn thì bạn phải thêm cột đó trong câu lệnh chọn và sử dụng số cột để sắp xếp theo.

select distinct(n_num), k_str from abc_test order by 2 
-1

bạn có thể làm

select distinct top 10000 (n_num) --assuming you won't have more than 10,000 rows     
from abc_test order by(k_str) 
1

Khi tôi cùng một lỗi, tôi đã nhận nó giải quyết bằng cách thay đổi nó như

SELECT n_num 
FROM(
    SELECT DISTINCT(n_num) AS n_num, k_str 
    FROM abc_test 
) as tbl 
ORDER BY tbl.k_str 
Các vấn đề liên quan