ВНЕШНЕЕ СОЕДИНЕНИЕ, использующее IN list? - PullRequest
3 голосов
/ 15 января 2010

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

Вот пример того, что я сейчас использую:

SELECT custid, name, email  
FROM customers  
WHERE custid IN  
('1111', '2222', '3333', '4444')  

Возвращает все записи в таблице клиентов, где идентификаторы клиентов совпадают с идентификаторами в списке, который я предоставляю.

Я бы хотел найти способ вернуть результаты, например, ВНЕШНЕЕ СОЕДИНЕНИЕ, где я мог бы видеть совпадения и пропуски.

К вашему сведению: я использую MS SQL Server, но было бы полезно сделать это и в mySQL. Спасибо!

Ответы [ 5 ]

3 голосов
/ 15 января 2010

Есть несколько способов сделать это. Вот два:

SELECT C1.custid, name, email, C2.CustID As Match FROM customers As C1 left join (SELECT custid FROM customers<br> WHERE custid IN<br> ('1111', '2222', '3333', '4444')) As C2 on C1.custid=C2.custid

Там будет число (один из 4) в столбце Match , если это одно из чисел. Или:

SELECT custid, name, email, Case When custid in ('1111', '2222', '3333', '4444') Then 'Match' Else '' End As IsMatch FROM customers

В столбце IsMatch будет указано «Соответствие», если это одно из четырех значений.

Второй обычно будет быстрее.

2 голосов
/ 15 января 2010

Используйте пользовательскую функцию для генерации таблицы из списка значений, разделенных запятыми. Затем вы можете выполнить внешнее соединение со списком, например так:

select customers.custid, name, email
  from customers
    left outer join dbo.get_id_table('1111', '2222', '3333', '4444') as ids
      on (customers.custid = ids.custid)

Существует несколько версий функции типа 'get_id_table', опубликованной здесь и в других местах в Интернете (извините - я не могу сейчас найти ссылку).

2 голосов
/ 15 января 2010

Это, вероятно, будет работать. Я использую таблицу #test вместо таблицы ваших клиентов и заполняю ее 1, 3 и 5. Затем я ищу 1, 2 и 3.

CREATE TABLE #test 
(
    id int
)
GO

INSERT INTO #test
SELECT 1 UNION SELECT 3 UNION SELECT 5
GO

SELECT *
FROM ( SELECT 1 AS id UNION SELECT 2 UNION SELECT 3 ) s
LEFT OUTER JOIN #test t ON s.id=t.id

Вот пример использования таблицы ваших клиентов:

SELECT s.SearchId, c.custid, c.name, c.email
FROM ( SELECT '1111' AS SearchId UNION SELECT '2222' 
    UNION SELECT '3333' UNION SELECT '4444' ) s
LEFT OUTER JOIN customers c ON s.SearchId=c.custid
0 голосов
/ 15 января 2010

SQL сервер 2005, 2008

DECLARE @tmp TABLE (id varchar(8))

INSERT INTO @tmp ( id )
SELECT  '1111' UNION
SELECT  '2222' UNION
SELECT  '3333' UNION
SELECT  '4444' ;

SELECT c.custid, c.name, c.email  
FROM customers AS c
LEFT JOIN @tmp AS t ON t.id = customers.custid
0 голосов
/ 15 января 2010

Вы хотите, чтобы вы положили в таблицу свои собранные вами кастиды и присоединились вот так ...

CREATE TABLE #temp
(
    custid varchar(4)
)

INSERT INTO #temp(employeeid) VALUES '1111'
INSERT INTO #temp(employeeid) VALUES '2222'
INSERT INTO #temp(employeeid) VALUES '3333'
INSERT INTO #temp(employeeid) VALUES '4444'

SELECT c.custid, name, email, t.custid  
FROM customers c
LEFT JOIN #temp t ON c.custid = t.custid
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...