选择仅属于作为参数传递的列表的ID

时间:2017-11-09 16:23:50

标签: sql-server sql-server-2012

让我们从数据开始:

DECLARE @Avengers TABLE ([Hero] varchar(32), [Preference] varchar(32));

INSERT INTO @Avengers VALUES
('Captain_America','gingers'),('Captain_America','blondes'),
('Captain_America','brunettes'),('Hulk','gingers'),('Hulk','blondes'),
('Hawkeye','gingers'),('Hawkeye','brunettes'),('Iron_Man','blondes'),
('Iron_Man','brunettes'),('Thor','gingers'),('Nick_Fury','blondes');

现在我想将@Preferences作为[Preference]列表(逗号分隔或单列表参数)传递,而不知道我将获得多少参数,并根据此选择[Hero]谁更喜欢参数(列表)中提供的完全这些@Preferences,我的意思是,如果我在'blondes''gingers'之后,那么我在'Hulk' 之后 ('Captain_America'更喜欢'金发女郎','gingers'和'黑发''。

我想得到类似的东西:

SELECT [Hero]
FROM @Avengers
WHERE *IS_ASSIGNED_ONLY_TO_THE_LIST*([Preference]) = @Preference

1 个答案:

答案 0 :(得分:2)

好吧,我认为我的代码过于复杂,但它确实有效。

SELECT a.Hero, COUNT(*), MIN(p.N)
FROM @Avengers a
LEFT JOIN ( SELECT *, COUNT(*) OVER() N
            FROM @Preferences) p
    ON a.Preference = p.Preference
GROUP BY a.Hero
HAVING COUNT(*) = MIN(p.N)
AND COUNT(*) = COUNT(p.Preference)
;

我正在使用@Preferences作为表格。