2009-12-01 30 views
13

Tại sao chúng ta không thể sử dụng count(distinct *) trong SQL? Như để đếm tất cả các hàng riêng biệt?Số lượng SQL (*) và riêng biệt

+0

Bạn có ý nghĩa gì bởi 'các hàng riêng biệt'? –

+0

Bạn có các hàng được sao chép trong toàn bộ hàng không, đó là những gì bạn đang cố tìm? –

+0

Bây giờ khi tôi nghĩ về nó, bởi vì các bảng của chúng ta được chuẩn hóa, chúng ta sẽ không có các hàng chính xác như vậy nên nó vô dụng đúng không ?? Đây có phải là lý do không ?? –

Trả lời

27
select count(*) from (select distinct * from MyTable) as T 

Mặc dù tôi đề nghị rằng bạn suy nghĩ lại bất kỳ truy vấn sử dụng DISTINCT. Trong một tỷ lệ lớn các trường hợp, GROUP BY phù hợp hơn (và nhanh hơn).

EDIT: Sau khi đọc các ý kiến ​​hỏi, tôi phải chỉ ra rằng bạn nên bao giờ hỏi DBMS để làm việc nhiều hơn thực sự cần làm để có được một kết quả. Nếu bạn biết trước rằng sẽ không có bất kỳ hàng trùng lặp nào trong một bảng, thì đừng sử dụng DISTINCT.

+0

@CHristian - hi, chưa bao giờ thấy nó được thực hiện theo cách đó trước đây. hết tò mò chạy nó với một bảng hiện có trên đầu của tôi và tôi nhận được 'cú pháp sai gần') ''. làm việc trong máy chủ sql ms? lưu ý - lựa chọn của tôi trong các dấu ngoặc chạy hoàn toàn – Kamal

+2

Trên Oracle DISTINCT và GROUP BY có cùng một kế hoạch thực hiện vì DISTINCT được triển khai bằng GROUP BY. Vì vậy, không nên có sự khác biệt. –

+0

@Kamal: Xin lỗi, quên rằng Máy chủ SQL hơi khó hiểu với các truy vấn lồng nhau. Thêm một bí danh tên vào cuối ('như T') giải quyết được vấn đề. –

1

Bạn thực sự có thể.

Nếu bạn đã có số nhận dạng, tuy nhiên, bạn sẽ không có bất kỳ hàng hoàn toàn riêng biệt nào. Nhưng bạn có thể làm ví dụ:

SELECT COUNT(DISTINCT SenderID) FROM Messages 
9

Bạn có thể chọn tất cả các cột trong bảng và nhóm của bạn bằng cách ...

SELECT column1, column2, column3, count(*) 
FROM someTable 
GROUP BY column1, column2, column3 
+0

Điều này không thực sự có được những gì câu hỏi yêu cầu mặc dù. –

3

tại sao không?

select 
    count(distinct name) 
from 
    people 
+0

Bởi vì hai người có thể có cùng tên. OP hỏi về COUNT (DISTINCT *). –

+0

Xin lỗi, đó là một văn bản khác trong câu hỏi khi tôi trả lời. – silent

-2

UberKludge, và có thể được postgre cụ thể, nhưng

select count(distinct table::text) from table 
0

Bạn có thể thử một CTE trong Sql Server 2005

;WITH cte AS (
     SELECT DISTINCT Val1,Val2, Val3 
     FROM @Table 
) 
SELECT COUNT(1) 
FROM cte 

Để trả lời câu hỏi, Từ các tài liệu

Chỉ định rằng tất cả các hàng phải là được tính để trả về tổng số hàng trong một cái bàn. COUNT () không có thông số và không thể sử dụng với DISTINCT. COUNT () không yêu cầu tham số biểu thức vì, theo định nghĩa , nó không sử dụng thông tin về bất kỳ cột cụ thể nào. COUNT (*) trả về số lượng hàng trong một bảng được chỉ định mà không cần loại bỏ các từ khóa trùng lặp. Nó tính mỗi hàng riêng biệt. Điều này bao gồm hàng chứa giá trị null.

+0

Khi bạn nói, "Từ tài liệu", tài liệu đó sẽ là gì? –

+0

Tài liệu trợ giúp máy chủ Sql. http://msdn.microsoft.com/en-us/library/ms175997.aspx –

0

COUNT (*) là số hàng phù hợp với truy vấn.

Hàng có chứa thông tin duy nhất như rowid. Tất cả các hàng đều theo định nghĩa riêng biệt.

Bạn phải tính các trường hợp giá trị khác biệt trong một số trường thay thế.

+3

Tại sao một hàng chứa thông tin duy nhất? Nó không phải ... nó có lẽ nên nhưng không * yêu cầu *. – Murph

0

một số languajes có thể không xử lý được 'khác biệt *', nếu bạn muốn phân biệt được thực hiện qua nhiều cột, bạn có thể muốn sử dụng 'ColumnA | CộtB ', kết hợp các giá trị trước khi đánh giá nếu chúng khác nhau. Hãy chú ý xem các biến của bạn có phải là số hay không và trình xử lý cơ sở dữ liệu của bạn có thể tạo kiểu tự động cho các chuỗi ký tự.

+1

Đây cũng không phải là phương pháp chứng minh đầy đủ. Ví dụ, ('test', 'string') và ('tes', 't string') sẽ giống nhau. Bạn có thể làm một cái gì đó với đệm các chuỗi, nhưng nó bị lộn xộn. IMO tốt hơn chỉ sử dụng truy vấn con với DISTINCT và sau đó nhận được COUNT từ đó. –

-2
select count (Tag_no) from tab_raw_tag_value where tag_no in (select distinct tag_no from tab_raw_tag_value) 
+0

Điều này không trả lời được câu hỏi –

Các vấn đề liên quan