2017-02-17 1 views
2

테이블이 2 개 있습니다.한 테이블에서 다른 테이블에서 레코드를 찾았는지 표시하는 추가 필드가있는 모든 레코드를 선택하십시오.

사용자 :

ID  CUSTOMID  NAME 
1  X543   John 
2  X354   Jane 
3  X389   Jack 
4  X123   James 

목록 : 나는 다음과 같은 결과가 필요

ID  CUSTOMID  NAME  ADDRESS 
1  X543   John  address1 
2  X543   John  address2 
3  X543   John  address3 
4  X543   John  address4 
5  X543   John  address5 
6  X354   Jane  address1 
7  X354   Jane  address2 
8  X354   Jane  address3 
9  X389   Jack  address1 
10  X389   Jack  address2 
11  X389   Jack  address3 
12  X389   Jack  address4 
13  X389   Jack  address5 
14  X389   Jack  address6 

: 목록 테이블에서하는 맞춤 다음이 있다면

ID  CUSTOMID  NAME  MATCHED 
1  X543   John  1 
2  X354   Jane  1 
3  X389   Jack  1 
4  X123   James 0 

나는에 추가 식별자가 필요합니다 사용자 표.

SELECT users.*, if(list.CUSTOMID IS NULL, FALSE, TRUE) AS matched from users LEFT JOIN list ON (users.CUSTOMID=list.CUSTOMID) 

그러나 동일한하는 맞춤와 목록 테이블에서 여러 기록이 있기 때문에 나는 중복을 많이 받고 있어요 : 여기에 지금까지 시도했습니다거야.

답변

1

당신은 당신이 두 테이블에서하는 맞춤에 대한 그룹해야, 난 당신이 중복하지 않아도 당신이 문에 의해 GROUP_를 사용할 수 있다고 생각 CASE를 사용하고

Select u.*, 
    case when exists (
    select 1 from list l where u.customid =l.customid 
) then 1 else 0 end matched 
From users u; 
+0

완벽하게 일했다! 감사! –

-1

존재 할 수 있습니다. 그러나 select 문에서 (특성 customID 전에) 키워드 DISTINCT를 사용할 수도 있습니다. DISTINCT는 GROUP_BY보다 효율성이 떨어집니다.

1

매우 약간 기존 쿼리를 수정 ...

SELECT DISTINCT u.* 
       , COALESCE(l.CUSTOMID IS NOT NULL,0) matched 
      FROM users u 
      LEFT 
      JOIN list l 
      ON l.CUSTOMID = u.CUSTOMID 
+0

수정 해 주셔서 감사합니다. 작동하지만 쿼리를 실행하는 데 더 오래 걸립니다. –

관련 문제