匹配WHERE子句中的所有(非ANY)值

时间:2018-11-13 22:25:31

标签: tsql sql-server-2012

TL; DR如何在一个表中查找与另一个表中的所有(而不是ANY)行匹配的行?

这似乎很简单,但是我不知道正确的术语,所以我看到数十个使用INNER JOININTERSECTEXISTSALL的答案,但是达不到我所需要的。其他问题是PostgreSQL,通过应用程序动态生成的SQL,或者没有答案。

带以下喜欢不同颜色的人:

DECLARE @tbl TABLE (
    FirstName nvarchar(50),
    Color nvarchar(50)
);
INSERT INTO @tbl 
    (FirstName, Color) 
VALUES
    ('Bob',   'Purple'),
    ('Bob',   'Red'), 
    ('Bob',   'Yellow'), 
    ('Fred',  'Purple'),
    ('Fred',  'Red'), 
    ('Fred',  'Yellow'),
    ('Greg',  'Orange'), 
    ('Greg',  'Red'), 
    ('Harry', 'Red');

我需要找到喜欢我要搜索的所有颜色的人。

DECLARE @SearchColors TABLE (SearchColor nvarchar(50));
INSERT INTO @SearchColors (SearchColor) VALUES ('Red'),('Yellow');

因此,我只希望在结果中看到BobFred,因为只有这两个人喜欢我要搜索的所有颜色。我不希望只喜欢一种颜色的人,但是,人们是否喜欢这两种颜色也没关系(例如Bob喜欢3种颜色,包括我需要的两种颜色)。

通过在线阅读书籍,我发现ALL看上去很接近我的需要,但实际上什么也没找到(除非我使用错了):

SELECT
   *
FROM
   @tbl
WHERE
   (Color = ALL ( SELECT SearchColor FROM @SearchColors ));

1 个答案:

答案 0 :(得分:1)

如何获取所需的颜色总数,过滤主表中的颜色,然后计算具有这么多条目的名称?

DECLARE @colorcount INT = (SELECT COUNT(DISTINCT SearchColor) FROM @SearchColors)

SELECT firstname
FROM @tbl 
WHERE color IN (SELECT searchcolor FROM @SearchColors)
GROUP BY firstname
HAVING COUNT(DISTINCT color) = @colorcount

如果@tbl两次出现在您的('Greg', 'Red')中,或者您的@searchcolors表中两次出现了('Red'),这将处理您的$q5 = 'SELECT * FROM cities ORDER BY cityname'; $mytable5 = mysqli_query($conned, $q5); $row5 = mysqli_fetch_all($mytable5,MYSQLI_ASSOC); print_r ($row5); echo "<br><br>"; foreach($row5 as $key => $value){ print "Key = " . $key . ". Value = " . $value . ".<br><br>"; } 中的骗子