使用左连接这个t-sql查询有什么问题?

时间:2012-07-30 14:06:07

标签: tsql sql-server-2005

我有两个sqlserver 2005表:任务表和旅行表。

我正在尝试编写一个查询,从Task表中选择特定Empid的所有记录,如果Task是travel,也可以从另一个表中获取里程值。

我希望只选择一行,但返回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)

3 个答案:

答案 0 :(得分: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 

答案 1 :(得分:2)

TaskLog.EmpId = 12和TaskLog.Task ='Travel'是选择标准的一部分,而不是加入标准。

“查尔斯布雷塔纳”在不到1分钟的时间内打败了我。

答案 2 :(得分: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