需要简单的SQL指令吗

需要简单的SQL指令吗,sql,ms-access,Sql,Ms Access,我试图为我的Access表编写一个Ado SQL语句,但得到了错误的结果 员工表 ID Name DriverID 1 Alex 1 2 Tom 2 3 Trevor 3 4 PHIL 0 5 Gina 4 车辆表 ID PLATE EMPLOYEEID INSERVICE 1 123XYZ 1 N 2 456GFR 2 Y 3 TFV4FG 3 Y 4 F6GK7

我试图为我的Access表编写一个Ado SQL语句,但得到了错误的结果

员工表

ID      Name    DriverID
1   Alex    1
2   Tom     2
3   Trevor  3
4   PHIL    0
5   Gina    4
车辆表

ID  PLATE   EMPLOYEEID  INSERVICE
1   123XYZ  1       N
2   456GFR  2       Y
3   TFV4FG  3       Y
4   F6GK7D  4       Y
5   GEY7GH  1       Y
我想要所有员工的结果,并显示车辆信息(如果分配给他们)

Result should be
Name    Plate
Alex    GEY7GH
Tom     456GFR
Trevor  TFV4FG
PHIL    
Gina    F6GK7D

SELECT Employee.ID, Employee.FirstName, Vehicles.Plate, Vehicles.InService
FROM Employee LEFT JOIN Vehicles ON Employee.ID = Vehicles.DriverID
WHERE (((Vehicles.InService)=True));

不显示未分配给车辆的菲尔。

在正常数据库中,您可以将
WHERE
条件移动到
ON
子句。但我认为MS Access不支持这一点:

SELECT e.ID, e.FirstName, v.Plate, v.InService
FROM Employee as e LEFT JOIN
     Vehicles as v
     ON e.ID = v.DriverID AND v.InService = True;
另一种方法是子查询:

SELECT e.ID, e.FirstName, v.Plate, v.InService
FROM Employee as e LEFT JOIN
     (SELECT v.*
      FROM Vehicles as v
      WHERE v.InService = True
     ) as v
     ON e.ID = v.DriverID ;

从上表中可以看出,employee表中的DriverID列似乎与vehicles表中的EmployeeID列对齐,问题是join中的
on
子句

SELECT 
          Employee.ID
          ,Employee.FirstName
          ,Vehicles.Plate
          ,Vehicles.InService
FROM 
         Employee 
         LEFT JOIN Vehicles      ON Employee.DRIVERID = Vehicles.EMPLOYEEID
WHERE 
         (((Vehicles.InService)=True));

只需在联接中添加条件,确保在使用常量或简单等于以外的任何对象联接时使用括号以避免出现问题:

SELECT Employee.ID, Employee.FirstName, Vehicles.Plate, Vehicles.InService
FROM Employee LEFT JOIN Vehicles ON (Employee.ID = Vehicles.DriverID AND Vehicles.InService = True)

WHERE子句将左连接转换为内部连接。将条件从where移到join条件。Access不支持
ON
子句中的常量,只要使用括号。@ErikA。你知道这是否是一个(相对)新的功能吗?我很确定很久以前就没有了。我很确定至少从2007年开始(在此之前我很少使用Access),但括号可能会变得很棘手。@ErikA。仅供参考。我不是唯一一个认为MS Access不支持这一点的人:。当然,这是一个常见的误解。我想我甚至在作为一名Access开发人员的最初几天就传播了它,因为我被教导它没有。但我们可以简单地测试一下,看看它是否有效。