Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.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 Server查找包含的组_Sql_Sql Server_Contains - Fatal编程技术网

SQL Server查找包含的组

SQL Server查找包含的组,sql,sql-server,contains,Sql,Sql Server,Contains,我试图只选择不包含在其他组中的组 在本例中,组号2包含在组号1中,因为组号1具有组号2的所有值 组号3不包含在组号1中,因为它具有组号1不包含的值50 结果应该是第1组和第3组 或者相反,只获取包含在其他组中的组号2 寻找一种没有循环的方法,因为我有超过200万个值 我的桌子看起来像这样: group_number id ------------------- 1 10 1 20 1 30 1

我试图只选择不包含在其他组中的组

在本例中,组号2包含在组号1中,因为组号1具有组号2的所有值

组号3不包含在组号1中,因为它具有组号1不包含的值50

结果应该是第1组和第3组

或者相反,只获取包含在其他组中的组号2

寻找一种没有循环的方法,因为我有超过200万个值

我的桌子看起来像这样:

group_number    id
-------------------    
1               10
1               20
1               30
1               40
2               10
2               40
3               10
3               30
3               50

我已经用您提供的一组数据进行了测试,它是有效的。 第一组,不包含在另一组中的组:

SELECT DISTINCT Group_Number FROM #T
    WHERE NOT EXISTS (SELECT Group_Number G2 
                    FROM #T AS T2 
                    WHERE T2.Group_Number <> #t.Group_Number
                      AND T2.ID = #T.ID)
第8组没有出现,因为一个项目出现在第6组,另一个项目出现在第7组。 因此,我做了很多检查,并得出结论,以下代码是保证结果的代码,并提供可追溯性,以验证响应是否正确:

SELECT DISTINCT Group_Number FROM 
    (
    SELECT T1.Group_Number, T1.Rows, T2.Group_Number as Comparing_With_Other_Group, Count(DISTINCT T2.ID) AS Rows_On_Other_Group
        FROM (
            SELECT Group_Number, Count(DISTINCT ID) AS Rows 
                FROM #T
                GROUP BY Group_Number
        ) T1
        INNER JOIN #T AS T2
            ON T1.Group_Number <> T2.Group_Number
            AND EXISTS (SELECT 1 FROM #T WHERE #T.Group_Number = T1.Group_Number and #T.ID = T2.ID)
        GROUP BY T1.Group_Number, T2.Group_Number, T1.Rows
    ) SubQry
    WHERE Rows = Rows_On_Other_Group

如果仅运行子查询,您将看到可跟踪性,而完整查询将显示系统可以在其中找到另一个组的组,该组过滤我正在搜索的组中的ID,找到相同数量的ID。

您可以尝试以下查询

SELECT DISTINCT Group_Number FROM #temp
    WHERE NOT EXISTS (SELECT DISTINCT Group_Number G2 
                    FROM #temp AS T2 
                    WHERE T2.Group_Number <> #temp.Group_Number
                      AND T2.ID = #temp.ID)

我用计数逻辑得出了你的逻辑

   create table grp(a int ,b int)

   insert into grp

   select 1,10 union
   select 1,20 union
   select 1,30  union
   select 1,40  union
   select 2,10  union
   select 2,40  union
   select 3,10  union
   select 3,30  union
   select 3,50



   drop table #temo
   select distinct b.a as d ,b.b as g into #temo
   from grp a inner join grp b on (a.a<>b.a and a.b=b.b)
   where a.a <> b.a


   select a from grp
   except
   select a.d from (
   select d,count(tt) as cnt from (
   select d,g,row_number() over (partition by d  order by d)  tt from 
   #temo
   )rr
   group by d) a inner join (select a,count(a) as cnt from grp
   group by a) b on a.d=b.a and a.cnt=b.cnt

希望这有帮助。

每个组号代表一个集合,您需要检查给定集合是否是另一集合的子集。您可以将表本身连接起来,使每个集合与所有其他集合相匹配,并使用left join+count确定A是否为B的子集组A中的每一行在组B中都有匹配的行:

上面返回的组ID是示例中另一个组2的子集。在NOT-IN中使用上述命令可获取NOT-a-子集组ID

SELECT DISTINCT Group_Number FROM #temp
    WHERE NOT EXISTS (SELECT DISTINCT Group_Number G2 
                    FROM #temp AS T2 
                    WHERE T2.Group_Number <> #temp.Group_Number
                      AND T2.ID = #temp.ID)
Group_Number
1
3
   create table grp(a int ,b int)

   insert into grp

   select 1,10 union
   select 1,20 union
   select 1,30  union
   select 1,40  union
   select 2,10  union
   select 2,40  union
   select 3,10  union
   select 3,30  union
   select 3,50



   drop table #temo
   select distinct b.a as d ,b.b as g into #temo
   from grp a inner join grp b on (a.a<>b.a and a.b=b.b)
   where a.a <> b.a


   select a from grp
   except
   select a.d from (
   select d,count(tt) as cnt from (
   select d,g,row_number() over (partition by d  order by d)  tt from 
   #temo
   )rr
   group by d) a inner join (select a,count(a) as cnt from grp
   group by a) b on a.d=b.a and a.cnt=b.cnt
SELECT a.group_number
FROM t AS a
INNER JOIN (
    SELECT DISTINCT group_number
    FROM t
) AS x ON x.group_number <> a.group_number
LEFT JOIN t AS b ON b.group_number = x.group_number AND b.id = a.id
GROUP BY a.group_number, x.group_number
HAVING COUNT(a.id) = COUNT(b.id)