使用IN列表进行外部联接?

时间:2010-01-15 15:31:12

标签: sql sql-server

我想在一个表中只使用一个项目列表来查找命中和未命中,而不必创建一个新表来包含列表项而不使用任何脚本。我全天都做了很多临时查询,所以这很有用。

这是我现在正在使用的一个例子:

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

这将返回customers表中客户ID与我提供的列表中的客户ID匹配的所有条目。

我想找到一种方法来返回结果,比如OUTER JOIN,在那里我可以看到匹配以及未命中。

仅供参考:我正在使用MS SQL Server,但在mySQL中也能这样做很有用。谢谢!

5 个答案:

答案 0 :(得分:3)

有几种方法可以做到这一点。这是两个:

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

匹配列中将有一个数字(4个中的一个),如果它是其中一个数字。或者:

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

如果IsMatch列是四个值之一,则会说“匹配”。

第二个通常会更快。

答案 1 :(得分:2)

这可能会奏效。我使用表#test代替你的customers表并用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

以下是使用customers表的示例:

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

答案 2 :(得分:2)

使用用户定义的函数从逗号分隔的值列表生成表。然后你可以对列表进行外连接,如下所示:

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'类型函数(抱歉 - 我现在无法提供链接)。

答案 3 :(得分:0)

你希望你把你在搜索的custids放在桌子上并加入......

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

答案 4 :(得分:0)

SQL server 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