目前,我有三个表,我加入。我有从一个系统(旧)迁移到另一个系统(新)的数据。我需要比较这些数据,以确保匹配,但也不匹配。我有三张table。其中一个有正在移动的帐户列表。这两个系统具有不同的id类型,因此第一个表是两个表的所有id以及移动的每个帐户的列表。所以这是我的基本人口。
ID1 ID2
ABC 123
ABC 123
ABC 123
DEF 456
DEF 456
DEF 456
表2是旧系统的所有数据。
ID Fname Lname
ABC John Smith
ABC Tom Smith
ABC Kate Smith
DEF Jason Thomas
DEF Ruby Thomas
DEF Alex Johnson
那么表3是在新系统中找到的所有数据。
ID Fname Lname
123 John Smith
123 Tom Smith
123 Kate Smith
456 Jason Thomas
456 Ruby Thomas
现在,当我在id上加入这些表时,得到的行比我需要的要多。
当我加入时,我收到:
ID Fname_old Lname_old ID2 Fname_new Lname_new
ABC John Smith 123 John Smith
ABC John Smith 123 Tom Smith
ABC John Smith 123 Kate Smith
我正在尝试连接它们,因为它只返回匹配的行,如果找不到匹配的行,我仍然应该从id文件中获取id,并从表2中获取数据(旧数据),因为这是发送到新系统的数据。
ID1 ID2 Fname_old Lname_old Fname_new Lname_new
ABC 123 John Smith John Smith
ABC 123 Tom Smith Tom Smith
ABC 123 Kate Smith Kate Smith
DEF 456 Jason Thomas Jason Thomas
DEF 456 Ruby Thomas Ruby Thomas
DEF 456 Alex Johnson
我使用的代码是:
Select a.ID1, a.ID2, b.fname as fname_old, b.lnam as lname_old,
c.fname as fname_new, c.lname as lname_new
from table1 a
left join table2 b
on a.ID1 = b.ID
left join table3 c
on a.ID2 = c.ID
5条答案
按热度按时间pxq42qpu1#
您正在id列上加入它们。
当您有多个相同的id并在这些id上指定join时,id列通常是唯一的。
因为您需要比较数据,所以我建议您查找匹配项及其工作方式,因为这似乎更接近您在这里要查找的内容。
zvms9eto2#
如果它只是第一个表中的重复行,您可以尝试在派生表中区分它们,如下所示:
atmip9wb3#
如果你有一个比较的名字和姓氏的机会,这个代码将工作。
我的结果:
yfjy0ee74#
你说这是数据传输到两个系统。所以你希望所有的数据都匹配。因此,您可以减少查询以仅查找不匹配的数据(如果有的话)。
下面是一个符合sql标准的查询。你用Hive标记了你的请求。我不知道Hive,所以你可能需要调整查询。
这是一个完全反连接。它返回在另一个表中没有完全匹配的所有行。然而,它并没有猜测哪些偏离的行可能是成对的。结果如下:
如您所见,您必须手动检查此结果。但理想情况下,查询根本不应该返回任何行,这将证明一切都按预期进行,没有人(系统或人员)弄乱数据:-)
cwtwac6a5#
你可以使用
row_number()
:注意:这不会保留原始值的“顺序”,因此任何行都可以与任何其他行匹配。为什么?sql表表示无序集。
如果表中有排序,可以在
order by
子句以获得与顺序一致的匹配。