我有两个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)
答案 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'