4

我有这样的东西作为一个 sql 表:

EmplID   SkillID
1780 128
1780 133
2061 128
2068 128

假设我将字符串传递给存储过程,如“128,133”。我有一个拆分函数,所以 sql 可能如下所示:

SELECT DISTINCT EmplID
FROM EmplSkills
WHERE SkillID IN(SELECT data FROM dbo.Split(@Skills, ','))

您可以很容易地看到,通过 sql 语句,我们将获得 1780、2061 和 2068。我真正想要的是获得那些同时具有 128 和 133 作为技能 ID 的 EmplID,这样我应该只能获得 1780。

任何想法如何在没有一堆疯狂连接的情况下解决这个问题?

非常感谢。

4

1 回答 1

6
SELECT EmplID
FROM EmplSkills
WHERE SkillID IN(SELECT data FROM dbo.Split(@Skills, ','))
GROUP BY EmplID
HAVING COUNT(DISTINCT SkillID) = (SELECT COUNT(*) FROM dbo.Split(@Skills, ','))

或者,如果您使用的是 SQL Server,您可以使用 CTE 让生活更轻松。

; WITH Skills AS (
    SELECT DISTINCT data
    FROM dbo.Split(@Skills, ',')
)
SELECT EmplID
FROM EmplSkills
WHERE SkillID IN ( SELECT data FROM Skills )
GROUP BY EmplID
HAVING COUNT(DISTINCT SkillID) = (SELECT COUNT(*) FROM Skills)
于 2012-06-10T18:46:04.220 回答