我有两张桌子就像这样:
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,并且只在匹配两者时才加入条目?
答案 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中使用单词边界正则表达式,但主要思想是相同的。