Можно ли объединить таблицы по нескольким полям? - PullRequest
2 голосов
/ 01 ноября 2010

Сценарий такой. У нас есть таблица клиентов со всей логической информацией о клиентах и ​​другая таблица, которую мы будем называть «событие». В таблице событий, среди прочего, указаны имя, фамилия клиента и ssn.

В таблице customer, ssn - это varchar (9), предназначенный исключительно для цифр, однако ssn таблицы событий - это varchar (11), предназначенный для цифр и тире. Дело в том, что некоторые клиенты могут быть людьми или сущностями, а ssn используется для различения между ними как таковыми:

Народный формат ssn - 123-45-6789, а формат сущностей - 12-3456789.

Итак, я хочу выполнить запрос, объединяющий таблицы Customer и Event с именами и фамилиями, чтобы я мог проверить несоответствия в форматировании SSN в таблице Event.

Я относительно новый разработчик, поэтому я никогда не сталкивался с подобной ситуацией и не знаю, возможно ли это. Вот как выглядит мой текущий запрос:

SELECT top 10 c.firstname, c.lastname, c.ssn, e.ssn, e.firstname, e.lastname
FROM customer c with(nolock)
LEFT OUTER JOIN [event] e with(nolock) on 
c.firstname = e.firstname and
c.lastname = e.lastname

Ответы [ 2 ]

2 голосов
/ 01 ноября 2010

Да, вы можете использовать несколько полей, используя любой тип функции, определенный или определенный пользователем, в критериях предложения ON. Это как вы бы использовали в предложении WHERE, но находится в немного другом месте. Примеры:

FROM TABLE_A a
JOIN TABLE_B b ON b.col1 || ' ' || b.col2 = a.col

... или:

FROM TABLE_A a
JOIN TABLE_B b ON ABS(b.col) = a.col

Имеет ли значение, где происходит фильтрация?

WHERE или ON, не имеет значения, если использовать INNER соединение. Но это имеет значение, если используется соединение OUTER, потому что критерии ON применяются до / во время JOIN, а WHERE происходит после - это может кардинально изменить набор результатов.

0 голосов
/ 02 ноября 2010
SELECT top 10 c.firstname, c.lastname, c.ssn, e.ssn, e.firstname, e.lastname 
FROM customer c with(nolock) 
JOIN [event] e with(nolock) on  
c.firstname = e.firstname and 
c.lastname = e.lastname

Этот запрос сработал, он такой же, как и оригинальный, но левый внешний вывод дал мне искаженные результаты.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...