【问题标题】:SQL - JOIN if specific column contains data matching two othersSQL - 如果特定列包含与其他两个匹配的数据,则加入
【发布时间】:2014-12-30 02:08:15
【问题描述】:

我已经设置了两个表格,如下所示:

table1
id   | firstName  | lastName  
-----|------------|-----------  
01   | john       | smith
02   | dick       | johnson
03   | sam        | adams
04   | tiberius   | kirk

table2  
fullName            | status
--------------------|---------
john smith          | active
dick arnold johnson | active
samuel adams        | disabled
jim tiberius        | active

我需要将表 2 中的状态列获取到表 1。但问题是两个表中的名称不完全匹配(正如我已经证明的那样)。我想保留 table1 中的所有条目,即使它无法将它们与 table2 中的条目匹配。最终,我希望我的输出是这样的:

id   | firstName  | lastName  | fullName            | status
-----|------------|-----------|---------------------|--------
01   | john       | smith     | john smith          | active
02   | dick       | johnson   | dick arnold johnson | active
03   | sam        | adams     | samuel adams        | disabled
04   | tiberius   | kirk      | NULL                | NULL

我一直在尝试弄清楚如何使用 LEFT JOIN 来做到这一点,但我对 SQL 非常陌生,并且无法弄清楚 1) 如果 table1 和 table2 之间没有公共列和2) 我如何让它尝试在 fullName 中找到 fullName 和 lastName 并且仅在两者都匹配时才加入条目?

【问题讨论】:

  • 您确定没有其他方法可以在表 1 和表 2 之间获得真实身份匹配吗?如果不是,您可能不得不使用一些模糊逻辑(也许是 SOUNDEX)来推断关系,但不能保证匹配 100% 准确
  • @Blindy,我正在使用内部开发的工具,该工具使用 SQL 运行查询,因此我认为它不符合任何常见类型。不过,我对此的理解可能完全错误。
  • @BradD,我无法在两个表之间直接匹配,所以这肯定依赖于模糊逻辑。这是预期的结果,所以它不会 100% 准确也没关系。

标签: sql


【解决方案1】:

左外连接获取第一个表的所有行以及第二个表的行,即使第二个表中没有匹配的行。

对于完全匹配,您可以使用:

select * from table1 left outer join table2 on firstName || ' ' || lastName = fullName

在甲骨文中。

select * from table1 left outer join table2 on concat_ws(' ', firstName, lastName) = fullName

在 MySql 中。

对于部分匹配,例如:

select * from table1 left outer join table2 on fullName like firstName || '%' and fullName like '%' || lastName

在甲骨文中。

select * from table1 left outer join table2 on fullName like concat(firstName, '%') and fullName like concat('%', lastName)

您可以在数据库的“文本”包中使用更复杂的查询。

【讨论】:

    【解决方案2】:

    这是我在 T-SQL 中的做法:

    select *
    from table1
      left outer join table2 on name like fname+'%' and name like '%'+lname
    

    你可以在这里看到它的实际效果:http://sqlfiddle.com/#!3/10469/1/0

    因为 T-SQL 没有 regexp 运算符,这几乎是你能做的最好的。例如,您可以在 MySql 中使用单词边界正则表达式,但主要思想是相同的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-06-19
      • 2021-11-30
      • 2022-01-26
      • 1970-01-01
      • 2021-10-04
      • 1970-01-01
      • 2015-02-11
      相关资源
      最近更新 更多