2010-01-15 2 views
3

목록 항목을 포함하고 새 스크립팅을 사용하지 않고 새 테이블을 만들 필요없이 항목 목록 만 사용하여 테이블에서 히트 및 누락을 찾고 싶습니다. 하루 종일 많은 임시 쿼리를 수행하므로 유용 할 것입니다.OUT 목록에서 IN 목록을 사용합니까?

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

이 고객 ID가 내가 제공 목록에서 하나와 일치 고객 테이블의 모든 항목을 반환 :

여기에 내가 지금 사용하고 무엇의 예입니다.

OUTER JOIN과 같은 결과를 반환하는 방법을 찾고 싶습니다. 여기서 일치 항목과 누락 항목을 볼 수 있습니다.

FYI : 저는 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, 2, 여기

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 

3. 찾고 있어요 1, 3, 5로 채우기 해요 :

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

문자열 리터럴은 작은 따옴표를 사용하여 ... 당신은 당신의 테이블에서 검색하여 custids을 넣고과 같이 가입하려는. – Joey

+0

두 번째 옵션은 일종의 작품입니다. 불행히도 쿼리는 customers 테이블의 모든 항목 (목록에있는 항목 제외)에 대해 검사합니다. 따라서 필자는 필요한 것보다 많은 데이터를 얻었습니다. 내가 고객의 테이블을보고있는 경우에는 200k + 레코드가 있으므로 도움이되지 않아 모든 레코드를 반환하여 4 개의 일치 항목을 찾습니다. 그래도 고마워! – ShinobiDev

+0

나는 이해하지 못한다. 당신의 질문은 당신이 모든 기록을보고 싶어하는지 말하지 않습니까? –

0

당신은

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

0

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 
관련 문제