2012-12-17 27 views
6

Tôi đang cố gắng chọn các hàng từ một bảng có bản sao trong một cột nhưng cũng hạn chế các hàng dựa trên cột khác. Nó dường như không hoạt động chính xác.máy chủ sql tìm bản sao trên một cột nhưng sử dụng chọn nơi

select Id,Terms from QueryData 
    where Track = 'Y' and Active = 'Y' 
    group by Id,Terms 
    having count(Terms) > 1 

Nếu tôi xóa vị trí hoạt động tốt nhưng tôi chỉ cần hạn chế nó ở những hàng này.

ID  Terms  Track Active 
100  paper  Y  Y 
200  paper  Y  Y 
100  juice  Y  Y 
400  orange N  N 
1000 apple  Y  N 

lý tưởng là truy vấn nên trả lại 2 hàng đầu tiên.

+0

Tôi nghĩ rằng một số dữ liệu mẫu sẽ giúp minh họa vấn đề của bạn ... Tôi nhận thấy bạn đang nhóm bởi 'Id', là cột này phải là duy nhất trong bảng này? –

+0

không có chỉ mục nào trên bảng này và sẽ cung cấp mẫu ở trên – vbNewbie

Trả lời

1

Không chính xác nhận được những gì bạn đang làm. Bạn sử dụng count(Terms) trong having tuy nhiên Terms nằm trong mệnh đề select của bạn. Nó có nghĩa là đối với mỗi hồ sơ count(Terms) sẽ là 1. Có thể bạn phải loại trừ Terms từ danh sách select. Thành thật mà tôi đã sao chép bảng và truy vấn của bạn và nó không hoạt động.

lẽ this là những gì bạn đang tìm kiếm (?):

select Id, count(Terms) from QueryData 
where Track = 'Y' and Active = 'Y' 
group by Id 
having count(Terms) > 1 
1

này sẽ trả về tất cả các điều khoản nhân đôi đáp ứng các tiêu chí:

select Terms 
from QueryData 
where Track = 'Y' and Active = 'Y' 
group by Terms 
having count(*) > 1 

http://sqlfiddle.com/#!3/18a57/2

Nếu bạn muốn tất cả các chi tiết cho các điều khoản này, bạn có thể tham gia vào kết quả này.

;with dups as (
    select Terms 
    from QueryData 
    where Track = 'Y' and Active = 'Y' 
    group by Terms 
    having count(*) > 1 
) 
select 
    qd.ID, qd.Terms, qd.Track, qd.Active 
from 
    QueryData qd join 
    dups d on qd.terms = d.terms 

http://sqlfiddle.com/#!3/18a57/5

6
SELECT Id, Terms, Track, Active 
FROM QueryData 
WHERE Terms IN (
       SELECT Terms 
       FROM QueryData 
       WHERE Track = 'Y' and Active = 'Y' 
       GROUP BY Terms 
       HAVING COUNT(*) > 1 
       ) 

Demo trên SQLFiddle

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