2016-12-20 4 views
-1

고유 ID를 기반으로 다른 테이블에 조인해야하는 테이블이 있습니다. 내가 할 경우 LEFT OUTER JOIN ON 내가 중복됩니다. 내 SELECTDISTINCT을 넣으면 정확한 레코드 수를 얻게됩니다. 그렇다면 내가 그 테이블에서 어떤 필드를 포함한다면 그 경우에 나는 LEFT OUTER JOIN을 다시 얻었습니다. 여기 내 쿼리입니다 : 예에서SQL 왼쪽 외부 조인?

SELECT DISTINCT 
Table1.fname, 
Table1.lname, 
Table2.address 
FROM Table1 
LEFT OUTER JOIN Table2 
ON Table2.user_id = Table1.userid 

내가 중복을 받고 있어요 위, 또한 내가 할 노력했다 : 이것은 나에게 기록의 정확한 수를 준

LEFT OUTER JOIN (
    SELECT user_id 
    FROM Table2 
    GROUP BY user_id 
) AS t2 ON Table1.user_id = t2.user_id 

하지만 일부 추가 열 필요 내가 뭔가를 놓친 또는 이러한 유형의 문제를 처리하기 위해 더 나은 방법이 있는지 궁금 해요

LEFT OUTER JOIN (
    SELECT user_id, address 
    FROM Table2 
    GROUP BY user_id, address 
) AS t2 ON Table1.user_id = t2.user_id 

: 나는 여분의 열을 포함 한 후 두 번째 테이블 것을, 나는 예를 다시 받고 중복입니다. 누군가가 뭔가를 보거나 더 나은 해결책을 알고 있다면 알려주세요.

+1

표 2의 기본 키는 무엇입니까? –

+4

여러 값을 가지고 있기 때문에 DISTINCT에서 추가 열을 사용하여 중복을 얻고 있습니다. 해당 열에서 원하는 여러 값 중에서 *를 * 말할 수있는 경우가 아니라면 수정 방법을 알려 드릴 수 없습니다. – RBarryYoung

+1

데이터를 볼 수 있습니까? – coderredoc

답변

1

데이터를 이해하지 않고 여기에서 정답을 선택할 수는 없습니다.

Table2user_id에 대해 address 개를 지원하는 것으로 보입니다. 이것은 일반적인 디자인입니다. - 표 2에서 중복 된 주소를 제거하고 다시이 상황을 방지하는 제약 조건을 추가

  1. 데이터를 수정 : 당신은 하나의 addressuser_id 당을 반환 할 경우, 당신은 몇 가지 옵션이 있습니다. 어느 주소가 정확하지 않은지 판별해야합니다.
  2. 사용자 당 하나의 주소 만 포함하도록 왼쪽 결합 축소 - 수행 방법은 다른 데이터에 따라 다릅니다. 배수가있는 곳으로 돌아갈 곳을 찾지 않거나 발효 일까지 주문하고 최신 날짜를 가져 가야하거나 청구서 수신 주소와 배송 주소가 필요한 경우에는 min() 또는 max()group by과 함께 사용할 수 있습니다. 올바른 것을 고르십시오.
  3. 사용자 당 여러 개의 주소가 있다는 것을 수락하십시오 - 이것이 맞을 수도 있습니다 - 나머지 코드를 조정하십시오.