SQL - 如果特定列包含与其他两个匹配的数据,则JOIN

时间:2014-12-30 02:08:15

标签: sql

我有两张桌子就像这样:

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

我需要将table2中的status列导入table1。但问题是两个表中的名称并不完全匹配(正如我所说的那样)。我想保留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 AND lastName,并且只在匹配两者时才加入条目?

2 个答案:

答案 0 :(得分:0)

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

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

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

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
在Oracle中

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

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

答案 1 :(得分:-1)

以下是我在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中使用单词边界正则表达式,但主要思想是相同的。

相关问题