0

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

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

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

3 回答 3

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 
于 2012-07-30T14:08:50.790 回答
2

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

而“Charles Bretana”则以不到 1 分钟的优势击败了我。

于 2012-07-30T14:09:45.927 回答
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

于 2012-07-30T14:11:19.520 回答