2010-01-15 41 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