SQL连接返回所连接列的行不包含任何公共值的行

时间:2014-02-23 19:05:39

标签: sql join

我正在为一家提供驾驶体验的公司创建预订系统。该公司在驾驶会议期间为客户雇用汽车。我有一个驾驶会议预订表,存储每个预订;驾驶会议表,其中包含每个驾驶会话的日期和时间;还有一张车牌,里面装着公司可以租用的每辆车。驾驶会话预订表通过外键链接到驾驶会话表,并且同样通过另一个外键链接到汽车表。

为了向客户提供他们可以在他们选择的驾驶会话中驾驶哪些车辆的列表,我想执行一个SQL查询来提取车载表中不是的记录与特定驾驶课程的任何驾驶会议预订相关联。

类似的东西:

SELECT 
    * 
FROM 
    tbl_car 
SOME-EXCLUDING-JOIN 
    tbl_driving_session_booking ON tbl_driving_session_booking.FK_CarID = tbl_car.PK_CarID 
INNER JOIN 
    tbl_driving_session ON tbl_driving_session_booking.FK_DrivingSessionID = tbl_driving_session.PK_DrivingSessionID 
WHERE 
    tbl_driving_session.PK_DrivingSessionID = some_value;

有没有可以让我这样做的联接?另外,还有其他方法可以在数据库的单个查询中找到未被使用的汽车吗?

提前致谢,LC。

2 个答案:

答案 0 :(得分:0)

您想要的查询使用left outer join

SELECT c.* 
FROM tbl_car c left outer join
     tbl_driving_session_booking dsb
     ON dsb.FK_CarID = c.PK_CarID left outer join
     tbl_driving_session ds
     ON dsb.FK_DrivingSessionID = ds.PK_DrivingSessionID and
        ds.PK_DrivingSessionID = somevalue
WHERE ds.PK_DrivingSessionID is null;

请注意,您的条件将移至联接的on子句。如果没有匹配项,那么表格中的ID将为NULL

我还在查询中添加了合理的表别名,使其更易于理解。

答案 1 :(得分:0)

您可以使用左连接和子查询来检测可用的汽车。

    SELECT * from 
    (SELECT 
    tbl_car.*,  tbl_driving_session_booking.FK_DrivingSessionID as flag
    FROM 
    tbl_car 
    left join
    tbl_driving_session_booking ON tbl_driving_session_booking.FK_CarID =   tbl_car.PK_CarID 
    left join 
    tbl_driving_session ON tbl_driving_session_booking.FK_DrivingSessionID = tbl_driving_session.PK_DrivingSessionID 
    WHERE 
    tbl_driving_session.PK_DrivingSessionID = some_value)
    where flag is null;