SQL将一组记录与另一组记录匹配

时间:2019-03-21 14:53:31

标签: sql

是否存在SQL语句将多个记录匹配到另一个表中的多个记录的完全匹配?

让我们说我有表A

ID | List# | Item
1  |   5   |  A
2  |   5   |  C
3  |   5   |  B
4  |   6   |  A
5  |   6   |  D

*我故意使“ ABC”项目乱序,因为我收到的记录的顺序可能乱序。

Table B
ID |  Group  | Item
1  |   AAA   |  A
2  |   AAA   |  B
3  |   AAA   |  C
4  |   AAA   |  D
5  |   BBB   |  A
6  |   BBB   |  B
7  |   BBB   |  C
8  |   DDD   |  A

如果查看第一个表,我希望List#5仅针对组“ BBB”返回匹配项,因为所有(且仅)三个记录都匹配。

2 个答案:

答案 0 :(得分:0)

最简单的方法是将其聚合为字符串或数组和join。标准SQL支持listagg(),因此您可以执行以下操作:

select a.list, b.list, a.items
from (select a.list, listagg(item, ',') within group (order by item) as items
      from a
      group by a.list
     ) a join
     (select b.list, listagg(item, ',') within group (order by item) as items
      from b
      group by b.list
     ) b 
     on a.items = b.items;

并非所有数据库都支持listagg()。许多(但不是全部)具有相似的功能。这比“标准” SQL方法更简单。

答案 1 :(得分:0)

您可以模拟数据库划分。这有点麻烦,但是在这里:

with
x as (
  select 
  from a
  where a.list = 5
),
y as (
  select grp, count(*) as cnt
  from b
  join x on x.item = b.item
  group by grp
)
select grp
from y
where cnt = (select count(*) from x)