SQL Server:查找另一组记录中存在的记录组

时间:2018-05-21 19:27:16

标签: sql sql-server

我是SQL Server的新手,如果某个群组包含在另一个群组中,我搜索了一个找到的解决方案。

查询结果应为grp_id 2,因为“A”+“B”包含在grp 3和5中。

结果应该是包含在其他组中的组的grp_id。有了这个结果,我将更新另一个表,与grp_id结合。

结果应为:

+----+
| id |
+----+
|  2 |
+----+

我坚持使用SQL,因为我没有找到比较组的解决方案。这个想法是使用按位比较。但为此,我必须在一个字段中添加每个项目的值。我认为可能有一种更简单的方法。

谢谢你,最诚挚的问候! 埃里克

create table tmp_grpid (grp_id int);
create table tmp_grp (grp_id int, item_val nvarchar(10));

insert into tmp_grpid(grp_id) values (1);
insert into tmp_grpid(grp_id) values (2);
insert into tmp_grpid(grp_id) values (3);
insert into tmp_grpid(grp_id) values (4);
insert into tmp_grpid(grp_id) values (5);

--
insert into tmp_grp(grp_id, item_val) values (1, 'A');
insert into tmp_grp(grp_id, item_val) values (2, 'A');
insert into tmp_grp(grp_id, item_val) values (2, 'B');
insert into tmp_grp(grp_id, item_val) values (3, 'A');
insert into tmp_grp(grp_id, item_val) values (3, 'B');
insert into tmp_grp(grp_id, item_val) values (3, 'C');
insert into tmp_grp(grp_id, item_val) values (4, 'A');
insert into tmp_grp(grp_id, item_val) values (4, 'C');
insert into tmp_grp(grp_id, item_val) values (4, 'D');
insert into tmp_grp(grp_id, item_val) values (5, 'A');
insert into tmp_grp(grp_id, item_val) values (5, 'B');
insert into tmp_grp(grp_id, item_val) values (5, 'E');

1 个答案:

答案 0 :(得分:1)

吉兹!

从技术上讲,第一组在所有其他组中都可以找到吗?所以,首先交叉连接到自身最好的条件是值是相同的并且组是不同的,但在我们这样做之前,我们需要知道有多少项属于每个组,这就是为什么我们有第一个选择一个包含每个组元素数的组,然后将其与交叉连接一起加入......希望这会有所帮助。

select distinct dist_grpid
from 
    (select grp_id, count(*) cc from tmp_grp group by grp_id) g
    inner join 
(
select dist.grp_id dist_grpid, tmp_grp.grp_id, count(*) cc
from 
    tmp_grp dist
    cross join tmp_grp 
where
    dist.item_val = tmp_grp.item_val and 
    dist.grp_id != tmp_grp.grp_id
group by
    dist.grp_id, 
    tmp_grp.grp_id
) cj on g.grp_id = cj.dist_grpid and g.cc = cj.cc