2010-01-15 16 views
3

我想在表格中仅使用项目列表来查找匹配项和未命中项,而不必创建新表来包含列表项并且不使用任何脚本。我一整天都在做很多即席查询,所以这会很有用。使用IN列表的OUTER JOIN?

这是我现在使用什么样的一个例子:

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

这将返回所有在客户表,其中客户ID匹配列表中的一个我提供的条目。

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

仅供参考:我使用的是MS SQL Server,但它也可以在mySQL中做到这一点。谢谢!

回答

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”型功能的几个版本(对不起 - 我不能拿出一个现在链接)。

2

这可能会奏效。我使用的替代你的客户表的表#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 
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栏会说“匹配”,如果它的四个值之一。

第二个通常会更快。

+0

字符串常量使用单引号。 – Joey 2010-01-15 15:40:33

+0

作品的第二种选择。不幸的是,查询将检查customers表中的所有条目 - 不仅仅是列表中的条目。所以,我得到的数据比我需要的还要多。在我查看我们的客户表的情况下,会有200k +条记录,因此无法返回所有这些记录来查找4个匹配项。虽然谢谢! – ShinobiDev 2010-01-15 16:06:07

+0

我不明白,你的问题没有说你想看所有的记录,匹配​​与否? – 2010-01-15 16:17:32

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 
+0

我宁愿不必创建任何新的或临时表。 – ShinobiDev 2010-01-15 15:46:06

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