我想在一个表中只使用一个项目列表来查找命中和未命中,而不必创建一个新表来包含列表项而不使用任何脚本。我全天都做了很多临时查询,所以这很有用。
这是我现在正在使用的一个例子:
SELECT custid, name, email
FROM customers
WHERE custid IN
('1111', '2222', '3333', '4444')
这将返回customers表中客户ID与我提供的列表中的客户ID匹配的所有条目。
我想找到一种方法来返回结果,比如OUTER JOIN,在那里我可以看到匹配以及未命中。
仅供参考:我正在使用MS SQL Server,但在mySQL中也能这样做很有用。谢谢!
答案 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