SQL查询,以获取从给定列表中购买项目的用户,并且该项目中不需要其他项目(不需要的);

SQL查询,以获取从给定列表中购买项目的用户,并且该项目中不需要其他项目(不需要的);,sql,sql-server,Sql,Sql Server,Users表分别有两个字段user id和item id,要求只打印给定列表中只有这些项的用户 给出的列表是7,8,9 Users是表名 usersid itemid ----------------- 123 - 8 123 - 8 123 - 8 222 - 7 222 - 8 222 - 9 333 - 7 333 - 9 444 - 8 444

Users表分别有两个字段user id和item id,要求只打印给定列表中只有这些项的用户 给出的列表是7,8,9

Users是表名

usersid    itemid
-----------------
123        - 8
123        - 8
123        - 8

222        - 7
222        - 8
222        - 9

333        - 7
333        - 9

444        - 8
444        - 7
444        - 6

555        - 9
555        - 9
555        - 5

666         - 8

766         - 6

888        -1
888        -7
888        -8

999         -7
999         -9
预期的答案是

123,
222,
333,
666,
999
解决这一问题的几次尝试导致产生了错误的答案。 请帮忙解释一下逻辑

感谢您的宝贵时间和贡献

我们称之为。根据具体规则,您的方法会有所不同。对于您问题中的场景,您希望用户标识中没有除7、8或9之外的ItemId行,因此您可以使用:

SELECT  t.UsersID
FROM    (VALUES
            (123, 8), (123, 8), (123, 8), (222, 7), (222, 8), (222, 9), 
            (333, 7), (333, 9), (444, 8), (444, 7), (444, 6), (555, 9), 
            (555, 9), (555, 5), (666, 8), (766, 6), (888, 1), (888, 7), 
            (888, 8), (999, 7), (999, 9)
        ) AS T (UsersID, ItemID)
GROUP BY t.UsersID
HAVING COUNT(CASE WHEN t.ItemID NOT IN (7, 8, 9) THEN t.ItemID END) = 0;
如果您想了解具有全部7、8和9且没有其他值的用户,则可以使用:

SELECT  t.UsersID
FROM    (VALUES
            (123, 8), (123, 8), (123, 8), (222, 7), (222, 8), (222, 9), 
            (333, 7), (333, 9), (444, 8), (444, 7), (444, 6), (555, 9), 
            (555, 9), (555, 5), (666, 8), (766, 6), (888, 1), (888, 7), 
            (888, 8), (999, 7), (999, 9)
        ) AS t(UsersID, ItemID)
GROUP BY t.UsersID
HAVING COUNT(DISTINCT t.ItemID) = COUNT(DISTINCT CASE WHEN t.ItemID IN (7, 8, 9) THEN t.ItemID END)
AND COUNT(DISTINCT t.ItemID) = 3;
注意:如果您的表已经约束元组
UsersId,ItemId
是唯一的,那么不需要使用
COUNT(DISTINCT…
,您可以简单地使用
COUNT(…)
,因为您已经知道ItemId是不同的

如果您还需要返回ItemIds,那么您可能会发现使用
NOT EXISTS
更容易,例如

WITH T AS
(   SELECT  UsersID, ItemID
    FROM    (VALUES
                (123, 8), (123, 8), (123, 8), (222, 7), (222, 8), (222, 9), 
                (333, 7), (333, 9), (444, 8), (444, 7), (444, 6), (555, 9), 
                (555, 9), (555, 5), (666, 8), (766, 6), (888, 1), (888, 7), 
                (888, 8), (999, 7), (999, 9)
            )  AS t(UsersID, ItemID)
)
SELECT  *
FROM    T
WHERE   NOT EXISTS 
        (   SELECT  1 
            FROM    T AS T2 
            WHERE   T2.UsersId = T.UsersId 
            AND     T2.ItemID NOT IN (7, 8, 9)
        );

链接的文章介绍了各种其他技术和场景,但以上内容应该足以让您开始学习。

如果您可以格式化示例数据并显示您尝试过的SQL,这将非常有帮助。“解决此问题的多次尝试导致产生了不正确的答案。”为什么会出现这些尝试?为什么它们不起作用?在提问时,您需要提供一个最小的可复制示例。请参考以下链接:请提供以下内容:(1)DDL和示例数据填充,即创建表和插入T-SQL语句。(2) 您需要做什么,即逻辑和代码尝试在T-SQL中实现它。(3) 所需输出,基于上述#1中的样本数据。(4) 您的SQL Server版本(选择@@version;)