2017-10-13 15 views
8

Tôi có một số dữ liệu mẫu như:logic để kiểm tra xem id chính xác có mặt trong một nhóm trong SQL Server

INSERT INTO mytable ([ID], [FK_ID], [TYPE_ID]) 
VALUES 
    (1, 10, 1), 
    (2, 11, 1), (3, 11, 2),  
    (4, 12, 1), (5, 12, 2), (6, 12, 3), 
    (7, 14, 2), (8, 14, 3) 

Bây giờ, ở đây tôi đang cố gắng để kiểm tra xem trong mỗi nhóm bởi FK_ID chúng tôi có trận đấu chính xác của TYPE_ID giá trị 1 & 2.

Vì vậy, sản lượng dự kiến ​​là như:

  1. (1, 10, 1) này nên thất bại
    • Như trong nhóm FK_ID = 10 chúng tôi chỉ có một bản ghi
  2. (2, 11, 1), (3, 11, 2) này phải vượt qua
    • Như trong nhóm FK_ID = 11 chúng tôi có hai hồ sơ.
    • Và cả hai TYPE_ID đều khớp với các giá trị 1 & 2.
  3. (4, 12, 1), (5, 12, 2), (6, 12, 3) này cũng nên thất bại
    • Như chúng ta đã có 3 hồ sơ ở đây.
  4. (7, 14, 2), (8, 14, 3) này cũng nên thất bại
    • Mặc dù chúng tôi có chính xác hai kỷ lục, nó nên thất bại là TYPE_ID đây không phù hợp với 1 & 2 giá trị.

Đây là nỗ lực của tôi:

select * 
from mytable t1 
where exists (select count(t2.TYPE_ID) 
       from mytable t2 
       where t2.FK_ID = t1.FK_ID 
       and t2.TYPE_ID in (1, 2) 
       group by t2.FK_ID 
       having count(t2.TYPE_ID) = 2); 

này không hoạt động như mong đợi, bởi vì nó cũng vượt qua cho FK_ID = 12 trong đó có ba hồ sơ.

Bản trình diễn: SQL Fiddle

Trả lời

2

Có thể có một số cách khác nhau để thực hiện việc này. Người ta có thể là:

SELECT FK_ID 
FROM mytable 
GROUP BY FK_ID 
HAVING COUNT(*) = 2 
AND MIN(TYPE_ID) = 1 
AND MAX(TYPE_ID) = 2 
+1

Cảm ơn giải pháp. Nó đã làm việc. – CodeNewbie

+0

@CodeNewbie Cách tốt nhất để cảm ơn người nào đó trong Stackoverflow là chấp nhận câu trả lời đó là câu trả lời của bạn – Valli

+0

Làm cách nào để chúng tôi có thể làm điều đó? Tôi không biết phải làm thế nào. – CodeNewbie

1

Chúng ta có thể thêm min và max vào nhóm bằng cách truy vấn

select t1.* from mytable t1, 
(select fk_id, count(*) As cnt from mytable 

       Group by fk_id 
       Having count(*) = 2 
       AND max(type_id)=2 
       ANd min(Type_id) = 1) As t2 
Where t1.fk_id = t2.fk_id 
+1

Cảm ơn giải pháp. Nó đã làm việc! – CodeNewbie

0

Một cách khác, nhưng ít tối ưu hơn Nenad của, là sử dụng SELECT INTO (với sản lượng để bảng tạm thời) và sau đó với một truy vấn SELECT chỉ những hàng có giá trị TYPE_ID thích hợp.

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