Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/82.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
找到一种使用SQL查询满足所有条件的项目列表的方法_Sql_Sql Server_Tsql - Fatal编程技术网

找到一种使用SQL查询满足所有条件的项目列表的方法

找到一种使用SQL查询满足所有条件的项目列表的方法,sql,sql-server,tsql,Sql,Sql Server,Tsql,我正在努力做到以下几点: select i.FirstName, i.LastName, COUNT(1) from ( select u.Id, uw.WidgetId from [DB].[dbo].[Widgets] w inner join UserWidgets uw on w.Id = uw.WidgetId inner join Users u on uw.UserId = u.Id where uw.WidgetId in ('2901731

我正在努力做到以下几点:

select i.FirstName, i.LastName, COUNT(1) from (
    select u.Id, uw.WidgetId from [DB].[dbo].[Widgets] w inner join
     UserWidgets uw on w.Id = uw.WidgetId inner join
     Users u on uw.UserId = u.Id
     where uw.WidgetId in ('29017318-FD89-4952-A3A2-8405BD5C5C44', 
                           'BDB7D25C-0794-4965-842D-E6D03A250418',
                          'CB4553AC-A47B-4AA6-9231-5C59C8F97655')
     group by u.Id, uw.WidgetId
     ) a
 inner join [Db2].[dbo].[Identities] i on a.Id = i.IdentityId
 group by i.LastName, i.FirstName
 order by i.LastName, i.FirstName
我想要的是确保“In”语句要求用户只有这3个Id。不多也不少

最好的方法是什么?

试试:

select i.FirstName, i.LastName, COUNT(1) from (
    select u.Id, uw.WidgetId from [DB].[dbo].[Widgets] w inner join
     UserWidgets uw on w.Id = uw.WidgetId 
                    and uw.WidgetId in ('29017318-FD89-4952-A3A2-8405BD5C5C44', 
                           'BDB7D25C-0794-4965-842D-E6D03A250418',
                          'CB4553AC-A47B-4AA6-9231-5C59C8F97655')
     inner join Users u on uw.UserId = u.Id
     left join UserWidgets uw2 on uw2.userid = u.id
                    and uw2.WidgetId not in ('29017318-FD89-4952-A3A2-8405BD5C5C44', 
                           'BDB7D25C-0794-4965-842D-E6D03A250418',
                          'CB4553AC-A47B-4AA6-9231-5C59C8F97655')
     where uw2.widgetid is null
     group by u.Id, uw.WidgetId
     ) a
 inner join [Db2].[dbo].[Identities] i on a.Id = i.IdentityId
 group by i.LastName, i.FirstName
 having count(1) = 3
 order by i.LastName, i.FirstName
尝试:

这应该起作用:

SELECT i.firstname,
       i.lastname,
       COUNT(1)
FROM   (SELECT u.id,
               uw.widgetid
        FROM   [DB].[dbo].[Widgets] w
               INNER JOIN userwidgets uw
                 ON w.id = uw.widgetid
               INNER JOIN users u
                 ON uw.userid = u.id
        WHERE  uw.widgetid IN ( '29017318-FD89-4952-A3A2-8405BD5C5C44',
                                        'BDB7D25C-0794-4965-842D-E6D03A250418'
                                        ,
                                'CB4553AC-A47B-4AA6-9231-5C59C8F97655' )
               AND NOT EXISTS (SELECT *
                               FROM   [DB].[dbo].[Widgets] w2
                                      INNER JOIN userwidgets uw2
                                        ON w2.id = uw2.id
                               WHERE  w2.id = w.id
                                      AND uw2.widgetid NOT IN (
                              '29017318-FD89-4952-A3A2-8405BD5C5C44',
                              'BDB7D25C-0794-4965-842D-E6D03A250418'
                              ,
                              'CB4553AC-A47B-4AA6-9231-5C59C8F97655' ))
        GROUP  BY u.id,
                  uw.widgetid) a
        HAVING COUNT(DISTINCT uw.widgetid) = 3
       INNER JOIN [Db2].[dbo].[Identities] i
         ON a.id = i.identityid
GROUP  BY i.lastname,
          i.firstname
ORDER  BY i.lastname,
          i.firstname 
这应该起作用:

SELECT i.firstname,
       i.lastname,
       COUNT(1)
FROM   (SELECT u.id,
               uw.widgetid
        FROM   [DB].[dbo].[Widgets] w
               INNER JOIN userwidgets uw
                 ON w.id = uw.widgetid
               INNER JOIN users u
                 ON uw.userid = u.id
        WHERE  uw.widgetid IN ( '29017318-FD89-4952-A3A2-8405BD5C5C44',
                                        'BDB7D25C-0794-4965-842D-E6D03A250418'
                                        ,
                                'CB4553AC-A47B-4AA6-9231-5C59C8F97655' )
               AND NOT EXISTS (SELECT *
                               FROM   [DB].[dbo].[Widgets] w2
                                      INNER JOIN userwidgets uw2
                                        ON w2.id = uw2.id
                               WHERE  w2.id = w.id
                                      AND uw2.widgetid NOT IN (
                              '29017318-FD89-4952-A3A2-8405BD5C5C44',
                              'BDB7D25C-0794-4965-842D-E6D03A250418'
                              ,
                              'CB4553AC-A47B-4AA6-9231-5C59C8F97655' ))
        GROUP  BY u.id,
                  uw.widgetid) a
        HAVING COUNT(DISTINCT uw.widgetid) = 3
       INNER JOIN [Db2].[dbo].[Identities] i
         ON a.id = i.identityid
GROUP  BY i.lastname,
          i.firstname
ORDER  BY i.lastname,
          i.firstname 
我在查询中添加了'AND count(WidgetId)=3',我相信这样行吗


我在查询中添加了'AND count(WidgetId)=3',我相信这会起作用?

一个问题:他们必须拥有所有三个id吗?要理解这个问题,用户必须有三个小部件,并且这三个小部件必须在in子句中列出小部件id,正确吗?您需要的操作员是“关系部门”,例如,一个问题:他们必须拥有所有三个id吗?要理解这个问题,用户必须恰好拥有三个小部件,并且这三个小部件必须在in子句中列出小部件id,正确吗?您需要的运算符是“关系分割”,例如,除非我周五下午喝啤酒的大脑出错(可能是),否则我认为您的查询将返回带有一个、两个或三个GUID的项。除非我周五下午喝啤酒的大脑出错(可能是),否则我认为您的查询将返回带有一个GUID的项,两个或三个guid。向最内部的查询添加
having count(distinct uw.widgetid)=3
将确保它具有所有三个id。您将它放在了错误的位置。它需要使用
GROUP BY u.id,uw.widgetid
,但您已将其放入
exists
查询中。将
having count(distinct uw.widgetid)=3添加到最里面的查询将确保它具有所有三个id。您将它放在了错误的位置。它需要使用
GROUP BY u.id,uw.widgetid
,但您已将其放入
exists
查询中。您不能在
where
子句中使用聚合语句,也不能检查用户是否有任何其他id。您是对的Allan。在group by子句之后应该有count(uw.WidgetId)=3。您不能在
where
子句中使用聚合语句,并且您没有检查用户是否有任何其他ID。您是对的Allan。在GROUPBY子句之后,我应该有count(uw.WidgetId)=3。