2012-07-30 2 views
0

두 개의 sqlserver 2005 테이블이 있습니다 : 작업 테이블과 여행 테이블.왼쪽 결합을 사용하는이 t-sql 쿼리에 어떤 문제가 있습니까?

특정 Empid에 대한 작업 테이블의 모든 레코드를 선택하는 쿼리를 작성하려고하며 작업이 여행중인 경우 다른 테이블에서 마일리지 값도 가져옵니다.

하나의 행만 선택하면되지만 Task 테이블의 모든 행이 반환됩니다.

내가 사용하고 쿼리가

Select Tasklog.TaskLogPkey, Tasklog.Empid , Tasklog.Task, TravelLog.Mileage from 
Tasklog 
left join TravelLog 
on 
    TaskLog.EmpId = 12 and TaskLog.Task ='Travel' and 
    TaskLog.TaskLogPkey = TravelLog.TaskLogPkey 

이다하지만 내가 잘못 뭐하는 거지

-- TaskLog.EmpId = 12 and TaskLog.Task ='Travel' and 

을 포함하지 않는 경우는 차이가 없습니다?

분명히 다음은 작동하지 않습니다

Select Tasklog.TaskLogPkey, Tasklog.Empid , Tasklog.Task, TravelLog.Mileage from 
Tasklog where TaskLog.EmpId = 12 and TaskLog.Task ='Travel' 
left join TravelLog 
on 
    TaskLog.TaskLogPkey = TravelLog.TaskLogPkey 

이는 내가 사용하고있는 테이블입니다 : 당신이 외부 조인을 수행 할 때

Create table TaskLog(
TaskLogPkey int not null, 
Empid int, 
Task varchar(30) 
) 

Insert Tasklog values(1,12,'Sales') 
Insert Tasklog values(2,4,'Travel') 
Insert Tasklog values(3,63,'Meeting') 
Insert Tasklog values(4,12,'Travel') 
Insert Tasklog values(5,12,'Email') 
Insert Tasklog values(6,4,'Travel') 
Insert Tasklog values(7,63,'Meeting') 
Insert Tasklog values(8,12,'PhoneCall') 


Create table TravelLog(
TaskLogPkey int not null, 
Mileage int 
) 

Insert TravelLog values(2,45) 
Insert TravelLog values(4,25) 
Insert TravelLog values(6,18) 
+0

당신이 외부 조인 왼쪽 봤어보기? – james31rock

+0

@ james31rock 'LEFT JOIN'과 'LEFT OUTER JOIN'은 같은 것입니다. 조인에 'OUTER'항목을 지정할 필요가 없습니다. – Taryn

답변

3

이 (왼쪽 조인은 왼쪽 외부한다 조인), 조인 조건에서 다른 외부면에 지정한 술어 (필터)에 관계없이 조인의 안쪽에있는 모든 레코드를 가져옵니다.
다른 쪽을 필터링하려면 Where 절을 추가해야합니다.

Select t.TaskLogPkey, t.Empid , t.Task, v.Mileage 
From Tasklog t 
    Left Join TravelLog v 
     On t.TaskLogPkey = v.TaskLogPkey 
Where t.Task ='Travel' 
    And t.EmpId = 12 
2

TaskLog.EmpId = 12 및 TaskLog.Task = '여행'은 선택 기준의 일부이며 조건을 결합하지 않습니다.

"Charles Bretana"가 1 분 미만으로 나를 이깁니다.

2

당신은 추가 기준으로 WHERE 절을 배치하려고한다 :

Select Tasklog.TaskLogPkey, Tasklog.Empid , Tasklog.Task, TravelLog.Mileage 
from Tasklog 
left join TravelLog 
    on TaskLog.TaskLogPkey = TravelLog.TaskLogPkey 
where TaskLog.EmpId = 12 
    and TaskLog.Task ='Travel' 

SQL Fiddle with Demo

관련 문제