【问题标题】:Select from multiple tables, remove duplicates从多个表中选择,删除重复项
【发布时间】:2012-04-03 04:47:57
【问题描述】:

我在 SQLite 数据库中有两个表,并且都有以下字段:

身份证号、名字、中间名、姓氏、电子邮件、登录名

一个表填充了所有这些,另一个没有填充 idnumber 或中间名。

我希望能够做类似的事情:

select idnumber, firstname, middlename, lastname, email, login 
from users1,users2 group by login;

但我得到一个“模棱两可”的错误。做类似的事情:

select idnumber, firstname, middlename, lastname, email, login from users1 
union 
select idnumber, firstname, middlename, lastname, email, login from users2;

看起来它可以工作,但我看到了重复项。我的理解是 union 不应该允许重复,但也许它们不是真正的重复,因为第二个用户表没有填充所有字段(例如“20,bob,alan,smith,bob@bob.com,bob " 与 "NULL, bob, NULL, smith, bob@bob.com, bob" 不同)。

有什么想法吗?我错过了什么?我想做的只是基于“登录”的重复数据删除。

谢谢!

【问题讨论】:

    标签: sql sqlite


    【解决方案1】:

    正如您所说,union 将删除重复记录(请注意,union all 不会!)。当所有列值都匹配时,两条记录被认为是重复的。在您在问题中考虑的示例中,很明显NULL 不等于20'alan',因此这些记录不会被视为重复。

    编辑:

    [...] 我能想到的唯一方法是创建一个新表 [...]

    这没有必要。我认为您可以执行以下操作:

    select login, max(idnumber), max(firstname), max(middlename), max(lastname),
      max(email) from (
        select idnumber, firstname, middlename, lastname, email, login from users1 
        union 
        select idnumber, firstname, middlename, lastname, email, login from users2
    ) final
    group by login
    

    但是,如果您确定在 idnumbermiddlename 上只有不同的值,则可以仅将这些字段最大化并按所有其他字段分组。

    【讨论】:

    • 对不起,我认为“登录”应该是确定它们是否重复的关键。所以,“20, bob, alan, smith, bob@bob.com, bob” 应该被认为是“NULL, bob, NULL, smith, bob@bob.com, bob”的匹配,因为两者都设置了“login” “鲍勃”。这是可行的吗?我的意思是,我能想到的唯一方法是创建一个新表,复制所有信息,然后进行“登录分组”。有没有更好的方法来做到这一点?
    • 完美!完美运行!谢谢!
    【解决方案2】:

    您可以通过登录将不完整的表格加入完整的表格。然后以编程方式操作结果集。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多