2009-09-14 78 views
6

Tôi đang làm việc trên đơn đăng ký nhân viên. Tôi đã có hai thực thể khác nhau Các dự án và Người dùng vừa được gán một số kỹ năng biến đổi.Cách so khớp/so sánh các giá trị trong hai kết quả trong SQL Server 2008?

Tôi đã có một bảng kỹ năng với các kỹ năng khác nhau (cột: id, name) tôi đăng ký các kỹ năng sử dụng trong một bảng gọi là UserSkills (với hai cột chính nước ngoài: fk_user và fk_skill) tôi đăng ký các kỹ năng dự án trong một bảng khác gọi là ProjectSkills (với hai cột khoá ngoài: fk_project và fk_skill).

Dự án có thể yêu cầu 6 kỹ năng và người dùng khác nhau khi đăng ký thiết lập Kỹ năng của họ.

Phần khó khăn là khi tôi phải tìm người dùng cho các Dự án của tôi dựa trên kỹ năng của họ. Tôi chỉ quan tâm đến người dùng đáp ứng rằng có TẤT CẢ các kỹ năng theo yêu cầu của dự án. Người dùng là ofcause được phép có tay nghề cao hơn sau đó yêu cầu.

Đoạn mã dưới đây sẽ không làm việc, (và thậm chí nếu nó đã làm, sẽ không phải là rất hiệu quả thân thiện), nhưng nó minh họa ý tưởng của tôi:

SELECT * FROM Users u WHERE 
    (SELECT us.fk_skill FROM UserSkills us WHERE us.fk_user = u.id) 
     >= 
    (SELECT ps.fk_skill FROM ProjectSkills ps WHERE ps.fk_project = [some_id]) 

Tôi đang suy nghĩ về việc chức năng của riêng tôi mà mất hai TABLE-biến, và sau đó làm việc ra so sánh trong đó (loại của một IN-chức năng sửa đổi), nhưng tôi muốn tìm một giải pháp đó là hiệu suất hơn thân thiện.

Tôi đang phát triển trên SQL Server 2008.

Tôi thực sự đánh giá cao bất kỳ ý tưởng hoặc đề xuất nào về điều này. Cảm ơn!

Trả lời

6
SELECT * 
FROM Users u 
WHERE NOT EXISTS 
     (
     SELECT NULL 
     FROM ProjectSkill ps 
     WHERE ps.pk_project = @someid 
       AND NOT EXISTS 
       (
       SELECT NULL 
       FROM UserSkills us 
       WHERE us.fk_user = u.id 
         AND us.fk_skill = ps.fk_skill 
       ) 
     ) 
+1

OMG! Bạn đã trả lời đúng câu trả lời chỉ sau 2½ phút! Bạn là người hùng của tôi! ;) Đây là câu hỏi đầu tiên của tôi về stackoverflow, nhưng chắc chắn không phải cuối cùng của tôi ... Cảm ơn bạn, giúp đỡ của bạn được nhiều đánh giá cao! –

+0

Zounds. Có một trang web nào đó phát hiện ra và làm rõ các tên và tiếng rít đằng sau việc sử dụng các truy vấn phụ có liên quan này không? –

+0

'@Philip Kelley': Tôi hiện đang viết một chuỗi các bài viết về' NOT IN' so với 'NOT EXISTS' và' LEFT JOIN/IS NULL' trong các 'RDBMS' khác nhau. – Quassnoi

0
-- Assumes existance of variable @ProjectId, specifying 
-- which project to analyze 
SELECT us.UserId 
from UserSkills us 
    inner join ProjectSkills ps 
    on ps.SkillId = us.SkillId 
    and ps.ProjectId = @ProjectId 
group by us.UserId 
having count(*) = (select count(*) 
        from ProjectSkills 
        where ProjectId = @ProjectId) 

Bạn muốn kiểm tra một debug này, vì tôi không có dữ liệu thử nghiệm để chạy nó thông qua. Ditto để lập chỉ mục để tối ưu hóa nó.

(Bây giờ đăng bài và xem liệu có ai đó nghĩ ra một cách tốt hơn - có điều gì đó tinh tế và hiệu quả hơn điều này không.)

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