2014-12-30 3 views
0

У меня есть две таблицы, настроенные вроде так:SQL - JOIN, если конкретный столбец содержит данные сопоставления двух других

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 в table1. Проблема в том, что имена в обеих таблицах не соответствуют точно (как я уже показал). Я хотел бы сохранить все записи в таблице1, даже если они не могут соответствовать их записи в таблице2. В конце концов, я хочу, чтобы мой выход будет что-то вроде этого:

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), к чему их присоединяться, если нет общего столбца между таблицами 1 и 2 и 2), как я могу заставить его найти полное имя и lastName в fullName и присоединяться только к записям, когда они совпадают?

+0

Какой SQL? – Blindy

+0

Вы уверены, что нет другого способа получить истинное соответствие идентичности между таблицами 1 и 2? Если нет, вам может потребоваться использовать некоторую нечеткую логику (возможно, SOUNDEX), чтобы вывести отношения, но вам не гарантируется, что матч будет на 100% точным. –

+0

@ Блинди, я использую внутренне разработанную инструмент, который использует SQL для запуска запросов, поэтому я не думаю, что он квалифицируется как любой из распространенных типов. Однако мое понимание этого может быть абсолютно неправильным. –

ответ

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

Вот как я это сделать в 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, но основная идея такая же.