2017-11-09 2 views
0

왼쪽 첫 번째 테이블에서 모든 결과를 반환하지 않습니다 참여

---------------------------- 
Id | Name | Description | 
---------------------------- 
1 One The number one 
2 Two The number two 
3 Three The number three 

을 다음과 그리고 다른 테이블 (user_number)이 그 특정 이러한 값을 참조하지만 나는, 참조 (수)에 사용되는 테이블이 사용자

-------------------------- 
Id | User_Id | Number_Id | 
-------------------------- 
1 400  1 
2 400  2 

첫 번째 표의 모든 결과를 검색하고 싶지만 그 결과도 일치하는 부분을보고 싶습니다. 나는 다음과 같은 쿼리를 사용하려고했지만 그것은 단지 내부는

SELECT n.Id, n.Name, n.Description, un.Id As Active_Number 
FROM number n 
LEFT JOIN user_number un 
ON n.Id = un.Id 
WHERE un.User_Id = 400; 

이 쿼리 반환 반환 가입 무엇을 반환 그러나이 숫자의 값의 세 번째 세트를 반환하지 않습니다

[ 
    { 
     "Id": 1, 
     "Name": "One", 
     "Description": "The number one", 
     "Active_Number": 1 
    }, 
    { 
     "Id": 2, 
     "Name": "Two", 
     "Description": "The number two", 
     "Active_Number": 2 
    } 
] 

을 표.

+1

물론, 'WHERE' 절을 참고하십시오. – zipa

+0

에 대한 다중 연결을 언제 수행 할 것인가? –

+0

1. 원하는 출력에 대한 부분적인 설명과 잘못된 쿼리의 제안에 동의하지 않는 부분 설명 - = 400을 언급하지 않았으므로. 실제로 원하는 출력이 입력과 어떻게 유사하게 보이는지 실제로 말하지는 않습니다. 2. 왼쪽 조인의 * 정의 *를 읽습니다. null로 확장 된 내부 조인 행과 일치하지 않는 왼쪽 테이블 행을 반환합니다. 모든 왼쪽 테이블이 참여하기 때문에 왼쪽 조인을 원한다고 생각되면 연관된 내부 조인이 무엇인지 명확히하십시오. 또한 400이없는 곳에서는 명확하게 어디서나 ids를 반환 할 수 없기 때문에 잘못되었다는 것을 알 수 있습니다. – philipxy

답변

2

보십시오. 대신 ON 절에 그 넣어 : - 권리를 왼쪽 테이블의 모든 행을 제외 아니라

SELECT n.Id, n.Name, n.Description, un.Id As Active_Number 
FROM number n 
LEFT JOIN user_number un 
ON n.Id = un.Id 
AND un.User_Id = 400; 
+0

당신의 SQL은 OP와 어떻게 다른가요? –

+0

완벽하게 작동합니다. 나는 범인이'WHERE' 조항에 있다고 생각조차하지 않았다. EXCEPT와 UNION을 시도해 보았지만 아무것도 반환하지 않았습니다. –

+0

@Rajaji'un.User_Id = 400'은 where 절 대신 join 조건에 있습니다. 왼쪽 조인은 조인하지 않는 레코드에 null을 남기므로 오른쪽 테이블에 대한 WHERE 필터를 사용하면 본질적으로 내부 조인이됩니다. –

2

그나마 'DB 사용하는지 알고 있지만 귀하의 WHERE 절은 INNER JOIN에이를하고있다

SELECT n.Id, n.Name, n.Description, un.Id As Active_Number 
FROM number n 
LEFT JOIN user_number un 
ON n.Id = un.Id and un.User_Id = 400; 
2

를가 있기 때문에 어디 상태에서, 당신은 사용자 ID가 400 아닌 모든 레코드를 제거합니다.

where 조건 배치에 따라 조인 후 전체 쿼리에 해당 필터를 적용합니다.

SELECT n.Id, n.Name, n.Description, un.Id As Active_Number 
FROM number n 
LEFT JOIN (select * from user_number 
WHERE un.User_Id = 400) un 
ON n.Id = un.Id; 

편집 : 당신이 대신 중독해야 할 것은 이것이다 다른 응답자의 대답이 코드까지 입력 할 때 저를 벗어났습니다 더 나은 선택이다 - 또한 작동하지만, 이상적인 솔루션이 아닙니다. 항상

+1

당신의 아이디어가 다른 것보다 더 논리적이라고 생각하고보고 내 자신의 대답에 넣었했다 너는 이미 같은 것을 제안했다. – hvd

+0

@hvd & Stassi 항상 여러 가지 방법으로 글을 쓸 수 있지만, 하나가 남긴만큼 간단하지는 않습니다. 가장 단순한 왼쪽 조인 정의는 내부 조인 행과 널 (null)로 확장 된 일치하지 않는 왼쪽 테이블 행입니다. 그래서 우리는 모든 왼쪽 테이블 행을 원하기 때문에 왼쪽 조인을 원하고 연관 조인의 조건을 식별해야하므로 조건을 분리 할 이유가 없습니다. – philipxy

0

당신이 내부 조인하고있는 경우이 절에에 조인 조건을 넣어, 그래서 절에 어떤 곳 조건을 추가하지 마십시오, 당신이 일을하는 경우 where 절

에 넣어 왼쪽에을 조인하고 조인의 오른쪽에있는 테이블에 대해 on 절에 조건을 추가하십시오. 조인의 오른쪽을 참조하는 where 절을 추가하면 조인이 내부 조인으로 변환되기 때문에 이것은 필수입니다 (아래 설명 된 한 가지 예외가 있음).

SELECT n.Id, n.Name, n.Description, un.Id As Active_Number 
FROM number n 
LEFT JOIN user_number un 
ON n.Id = un.Id 
AND un.User_Id = 400; 
0

WHERE 조건을 제거하면 의도 한대로 작동합니다. 기본적으로 왼쪽에 올바르게 연결 한 다음 세 번째 행을 필터링하는 것입니다.

당신은 당신이 할 수있는 모든 3 개 결과를 얻고 싶은 경우에 : 즉

SELECT n.Id, n.Name, n.Description, un.Id As Active_Number 
FROM number n 
LEFT JOIN user_number un 
ON n.Id = un.Id 
WHERE u.Id < 4; 

, 당신은 필터링해야하는 테이블을 조인 왼쪽에 왼쪽 일 (수)입니다.

1

LEFT JOIN은 첫 번째 표에서 모든 결과를 반환합니다.여기에 LEFT JOIN의 결과는 다음과 같습니다 당신이 User_Id = 400 필터링 할 경우 세 번째 행을 제외 이유

다음
 
------------------------------------------------------- 
Id | Name | Description  | Id | User_Id | Number_Id | 
------------------------------------------------------- 
1 One The number one 1 400  1 
2 Two The number two 2 400  2 
3 Three The number three NULL NULL  NULL 

은, 그것은 명백해야한다.

이러한 결과를 볼 때 일반적인 제안은 필터를 WHERE User_Id IS NULL OR User_Id = 400으로 변경하는 것입니다. 이 작업을 수행하지 마십시오. 당신이 제거 될 거라고 다시 여기

 
------------------------------------------------------- 
Id | Name | Description  | Id | User_Id | Number_Id | 
------------------------------------------------------- 
1 One The number one 1 400  1 
2 Two The number two 2 400  2 
2 Two The number two 3 500  2 
3 Three The number three 4 500  3 

, 그것은 명백해야한다 :

왼쪽은 결과의 모습에 가입 있도록, 다른 사용자 ID와 두 번째 테이블의 다른 레코드가있는 가정 마지막 줄.

당신이 작동 조인 상태로 WHERE 조건을 옮길받은 다른 답변,하지만 더 논리적, IMO, 접근 방식은 하위 쿼리를 사용하는 것입니다은 :

SELECT n.Id, n.Name, n.Description, un.Id As Active_Number 
FROM number n 
LEFT JOIN (
    SELECT * 
    FROM user_number 
    WHERE user_id = 400 
) AS un 
ON n.Id = un.Id; 

이 설정 데이터를 감소 참여하려는 데이터를 실제로 참여하려는 데이터에만 추가합니다. 그러나 결과는 user_id = 400을 조인 조건에 넣는 것과 같습니다.