2012-03-16 91 views
34

Tôi muốn kiểm tra xem một đoạn dữ liệu có xuất hiện nhiều lần trong một cột cụ thể trong bảng của tôi bằng SQL hay không. Đây là mã của tôi SQL về những gì tôi có cho đến nay:Xem một mục xuất hiện nhiều lần trong cột cơ sở dữ liệu

select * from AXDelNotesNoTracking where count(salesid) > 1 

salesid là cột tôi muốn kiểm tra, bất kỳ trợ giúp sẽ được đánh giá cao, cảm ơn.

+2

gì nhiều SQL? MySQL? Microsoft SQL Server? Oracle? Truy cập? vv – UnhandledExcepSean

Trả lời

80

Nó nên là:

SELECT SalesID, COUNT(*) 
FROM AXDelNotesNoTracking 
GROUP BY SalesID 
HAVING COUNT(*) > 1 

Về truy vấn ban đầu của bạn:

  1. Bạn không thể làm một SELECT * kể từ khi hoạt động này đòi hỏi một GROUP BY và cột cần phải hoặc là trong GROUP BY hoặc trong hàm tổng hợp (ví dụ: COUNT, SUM, MIN, MAX, AVG, v.v.)
  2. Vì đây là thao tác GROUP BY, mệnh đề HAVING sẽ lọc thay vì Ở ĐÂU

Edit:

Và tôi chỉ nghĩ về điều này, nếu bạn muốn xem MÀ mục đang chờ ở đó nhiều hơn một lần (nhưng điều này phụ thuộc vào cơ sở dữ liệu bạn đang sử dụng):

;WITH cte AS (
    SELECT *, ROW_NUMBER() OVER (PARTITION BY SalesID ORDER BY SalesID) AS [Num] 
    FROM AXDelNotesNoTracking 
) 
SELECT * 
FROM cte 
WHERE cte.Num > 1 

Tất nhiên, điều này chỉ hiển thị các hàng đã xuất hiện với cùng một SalesID nhưng không hiển thị giá trị SalesID ban đầu đã xuất hiện nhiều lần. Có nghĩa là, nếu một SalesID hiển thị 3 lần, truy vấn này sẽ hiển thị trường hợp 2 và 3 nhưng không hiển thị trường hợp đầu tiên. Tuy nhiên, nó có thể giúp tùy thuộc vào lý do tại sao bạn đang tìm kiếm nhiều giá trị SalesID.

Edit2:

Các truy vấn sau đây được đăng bởi APC dưới đây và là tốt hơn so với CTE tôi đề cập ở trên ở chỗ nó cho thấy tất cả các hàng trong đó một SalesID đã xuất hiện nhiều hơn một lần. Tôi bao gồm nó ở đây cho đầy đủ. Tôi chỉ thêm một ORDER BY để giữ các giá trị SalesID được nhóm lại với nhau. ORDER BY cũng có thể giúp đỡ trong CTE ở trên.

SELECT * 
FROM AXDelNotesNoTracking 
WHERE SalesID IN 
    ( SELECT SalesID 
      FROM AXDelNotesNoTracking 
      GROUP BY SalesID 
      HAVING COUNT(*) > 1 
    ) 
ORDER BY SalesID 
0

thử điều này:

select salesid,count (salesid) from AXDelNotesNoTracking group by salesid having count (salesid) >1 
+0

-1 Điều này thiếu mệnh đề HAVING để chỉ xác định các bản ghi xuất hiện nhiều lần, như câu hỏi ban đầu đang yêu cầu. –

+0

ông không đề cập rằng ông chỉ muốn xem nhiều hơn 1 hồ sơ nhưng để kiểm tra chúng –

+1

Câu hỏi nêu rõ: "Tôi muốn kiểm tra xem một đoạn dữ liệu có xuất hiện nhiều lần trong một cột cụ thể không". Nếu không có mệnh đề HAVING, bạn sẽ lấy lại tất cả các giá trị và nếu bảng lớn thì sẽ rất khó để tìm ra những giá trị xuất hiện nhiều lần. –

4

Làm thế nào về:

select salesid from AXDelNotesNoTracking group by salesid having count(*) > 1; 
Các vấn đề liên quan