SQL比较两组复杂数据

时间:2018-04-08 23:30:07

标签: sql ms-access compare

对不起,标题可能不是最好的,但我希望你能理解我有什么问题。

我需要比较和分析两组数据,并且我正在使用MS-Access。我的数据分为两个表格。以下不是我正在使用的真实数据,但可以作为示例提供:

表1

ID  Name
1   Zoie
2   Rohan
2   Simon
3   Jerome
4   Jakob
4   Mathew
4   Cora
6   Keely
7   Aiyana
7   Jake
8   Reid
9   Emerson

表2

ID  Name
1   Michael
2   Rohan
2   Simon
3   Jill
4   Jakob
4   Cora
5   Charlie
7   John
8   Reid
9   Yadiel
9   Emerson
9   Paris
  1. 因此,我只需要在两个表中只选择那些完全对应的ID(特定ID下的所有名称都相同),它们是:2和8

  2. 我还希望有一个单独的select语句,它将产生ID为2和8,但也有表1中名称的ID,这些ID也出现在表2中(所有来自表1加上表2中的一些额外内容)相同的ID)。那就是:2,8,9

  3. 我还希望有一个单独的select语句,它将产生ID 2和8,但也会出现表2中的名称ID,这些ID也出现在表1中(表2中的所有内容加上表1中的一些额外内容)相同的ID)。那就是:2,4,8

  4. 我还想要单独的select语句,它将是最后两个的组合。 结果将是:2,4,8,9

  5. 我将不胜感激任何建议。 提前致谢! 最好的祝福, 马里奥

1 个答案:

答案 0 :(得分:1)

,Q#1:

select id
from table1
group by id
having count(*) =
(
  select count(*)
  from table2
  group by table2.id
  having table2.id = table1.id
) 
and count(*) = 
(
  select count(*)
  from table1 table1_1
  inner join table2 on table1_1.id = table2.id and table1_1.name = table2.name
  group by table1_1.id
  having table1_1.id = table1.id
) 

此查询的说明:

  • 按ID分组table1
  • 对于每个组(对于每个ID),它计算table1中具有此ID的行数。
  • 对于每个组,它计算table2中具有此ID的行数。
  • 对于每个组,它计算该ID在两个表中出现的行数(它由inner join表1和表2上的ID和名称表示,这意味着只有两个ID的行两个表中的名称匹配将计入每个ID)。
  • 然后返回ID(来自table1),其中每个上述计数相等。这导致返回ID,其中所有名称都在两个表中(不多也不少)。

问题2 - 在这种情况下,您并不关心table2每个ID的名称数量是否相同。因此,删除第一个子查询(计算table2中匹配的行)。

select id
from table1
group by id
having count(*) = 
(
  select count(*)
  from table1 table1_1
  inner join table2 on table1_1.id = table2.id and table1_1.name = table2.name
  group by table1_1.id
  having table1_1.id = table1.id
) 

尽管上述内容很容易理解遵循与Q#1相同的逻辑,但执行以下操作可能更有效,而且更直接。只有当你发现数据运行速度太慢(主观和依赖于上下文)时,这才有意义。

select table1.id
from table1
left join table2 on table1.id = table2.id and table1.name = table2.name
group by table1.id
having count(table1.id) = count(table2.id)

这里,两个表是LEFT(外部)连接,这意味着收集来自table1的所有记录,并且table2中与ID和Name匹配的记录也包含在内。然后,我们按ID对它们进行分组,我们将table1中每个组的计数与table2中具有匹配名称的计数进行比较。

Q#3 - 除了交换table1和table2之外,这种情况与Q#2相同。

Q#4 - 在这种情况下,您只关心至少有一个名称出现在两个表中的ID。因此,加入表并返回不同的ID:

select distinct id
from table1 
inner join table2 on table1.id = table2.id and table1.name = table2.name

这是一个包含四个查询的SQLFiddle:http://www.sqlfiddle.com/#!18/3fc71/22