0

Task テーブルと Travel テーブルの 2 つの sqlserver 2005 テーブルがあります。

特定の Empid の Task テーブルからすべてのレコードを選択するクエリを作成しようとしています。Task が旅行の場合は、別のテーブルからマイレージ値も取得します。

1 つの行だけが選択されるはずですが、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

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 FiddlewithDemoを参照してください

于 2012-07-30T14:11:19.520 に答える
2

TaskLog.EmpId = 12 および TaskLog.Task ='Travel' は選択基準の一部であり、結合基準ではありません。

そして、「シャルル・ブレタナ」は1分もかからず私を打ち負かしました。

于 2012-07-30T14:09:45.927 に答える