2014-12-28 5 views
0

Say У меня есть две таблицы: table1 следующимSQL Соединение с групповыми символами

Name  |Surname| col1 
------------------------ 
Bob  |Smith | BS1 
Mary Jane|Jones | MJ1 

и table2 следующим образом:

Name  |Surname  | col2 
------------------------------ 
Bob  |Keller Smith | BS2 
Mary  |Jones   | MJ2 

То, что я хотел бы, чтобы присоединиться к этим вместе, чтобы получить:

Name  |Surname  | col1| col2 
------------------------------------- 
Bob  |Keller Smith | BS1 | BS2 
Mary  |Jones   | MJ1 | MJ2 

Я пробовал:

SELECT tableb.Name, tableb.Surname, tablea.col1, tableb.col2 
FROM table1 as tablea 
LEFT JOIN table2 as tableb 
ON '%'+tablea.Name+'%' LIKE '%'+tableb.Name+'%' AND '%'+tablea.Surame+'%' LIKE '%'+tableb.Surame+'%' 

Но они, казалось, присоединились ко всему.

Как я могу объединить столбцы с подстановочными знаками правильно?

+0

Вы хотите INNER JOIN. – Tomalak

+0

@Tomalak Я просто попробовал это и получил тот же результат. – Geoff

+0

(i) ''% ''слева от' LIKE ', скорее всего, являются излишними (в лучшем случае), но определенно не оценены как заполнители оператором' LIKE'. (ii) Преднамерен ли пробел перед «Боб»? – Abecee

ответ

1

Попробуйте это:

SELECT tableb.Name, tableb.Surname, tablea.col1, tableb.col2 
FROM table1 as tablea 
LEFT JOIN table2 as tableb 
    ON (tablea.Name LIKE '%' + tableb.Name + '%' OR tableb.Name LIKE '%' + tablea.Name + '%') 
    AND (tablea.Surname LIKE '%' + tableb.Surname + '%' OR tableb.Surname LIKE '%' + tablea.Surname + '%') 
+0

Это не получилось: я получил 'Имя Фамилия col1 col2 BS1 MJ1 ' – Geoff

+0

Я просто попытался его, и он возвращается в точности вывод, который вы ожидали. – dario

+0

О, это может быть проблема MySQL или SQLite? – Geoff

1

Я думаю, что вы хотите INNER JOIN.

Также обратите внимание, что знаки процента распознаются только с правой стороны оператора LIKE. Присоединение Name с Surname также не кажется правильным

SELECT 
    a.Name, b.Surname, a.col1, b.col2 
FROM 
    table1 AS a 
    INNER JOIN table2 AS b ON 
    a.Name LIKE '%' + b.Name + '%' 
    OR b.Name LIKE '%' + a.Name + '%' 
+0

@Tomalek Вы правы в отношении имени и фамилии. Я отредактирую свой вопрос соответствующим образом. – Geoff

+0

Это не сработало: я получил '[1] Имя Фамилия col1 col2 <0 rows> (или 0-length row.names)' – Geoff

0

Для данных образцов либо одно из следующих работ:

SELECT tableb.Name, tableb.Surname, tablea.col1, tableb.col2 
FROM table1 as tablea 
INNER JOIN table2 as tableb 
ON tablea.Name LIKE '%'+tableb.Name+'%' 
    AND tableb.Surname LIKE '%'+tablea.Surname+'%'; 

SELECT tableb.Name, tableb.Surname, tablea.col1, tableb.col2 
FROM table1 as tablea 
INNER JOIN table2 as tableb 
ON CHARINDEX(tableb.Name, tablea.Name) > 0 
    AND CHARINDEX(tablea.Surname, tableb.Surname) > 0; 

в SQL Server Fiddle и (с отрегулирован конкатенация и INSTR захват для CHARINDEX) в SQL Lite Fiddle.
Последняя версия может работать лучше, особенно когда могут использоваться индексы, которые (по крайней мере, в некоторых системах баз данных) игнорируются оператором LIKE.

Смежные вопросы