对不起,标题可能不是最好的,但我希望你能理解我有什么问题。
我需要比较和分析两组数据,并且我正在使用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
因此,我只需要在两个表中只选择那些完全对应的ID(特定ID下的所有名称都相同),它们是:2和8
我还希望有一个单独的select语句,它将产生ID为2和8,但也有表1中名称的ID,这些ID也出现在表2中(所有来自表1加上表2中的一些额外内容)相同的ID)。那就是:2,8,9
我还希望有一个单独的select语句,它将产生ID 2和8,但也会出现表2中的名称ID,这些ID也出现在表1中(表2中的所有内容加上表1中的一些额外内容)相同的ID)。那就是:2,4,8
我还想要单独的select语句,它将是最后两个的组合。 结果将是:2,4,8,9
我将不胜感激任何建议。 提前致谢! 最好的祝福, 马里奥
答案 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
)
此查询的说明:
inner join
表1和表2上的ID和名称表示,这意味着只有两个ID的行两个表中的名称匹配将计入每个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