mysql - 返回左表中的所有行,即使右表中没有记录以及右表中的最大到期日期

标签 mysql sql-server

提前感谢您帮助我解决这个问题,我是 SQL Server 新手,需要您的专家帮助,我想返回左表中的所有值,即使右表中没有记录以及 MAX(MOT Expiry) 或 MAX(Road)税)到期。

我尝试了此查询,但无法获得所需的结果

    SELECT Vehicle.id,vehicle.registrationMark, vehicle.status, RoadTax.Expiry, MOT.Expiry
    FROM Vehicle
    LEFT JOIN RoadTax ON Vehicle.id = RoadTax.VehicleID
    LEFT JOIN MOT ON Vehicle.id = MOT.VehicleID;

为了清楚地说明这一点,请看这个例子。我想从车辆表中返回所有车辆及其最大 TAX 和 MOT 到期时间。甚至道路税或 MOT 表中也没有车辆记录。

车辆表

    ---------------------------------
    | ID | RegistrationMark | Status |
    ---------------------------------
    |  1 | ABC              | Active |
    |  2 | DEF              | Active |
    |  3 | GHI              | Active |
    ---------------------------------

道路税表

    ------------------------------
    | ID | VehicleID | Expiry     |
    ------------------------------
    |  1 | 1         | 10/10/2013 |
    |  2 | 1         | 10/10/2014 |
    |  3 | 2         | 20/12/2014 |
    ------------------------------

MOT表

    -------------------------------
    | ID | VehicleID | Expiry      |
    -------------------------------
    | 1  | 2         | 25/01/2015  |
    -------------------------------

我想要的结果

    -----------------------------------------------------------
    | ID | RegistrationMark | Status | TaxExpiry  | MOTExpiry  |
    -----------------------------------------------------------
    | 1  | ABC              | Active | 10/10/2014 | NULL       |
    | 2  | DEF              | Active | 20/12/2014 | 25/01/2015 |
    | 3  | GHI              | Active | NULL       | NULL       |
    -----------------------------------------------------------

非常感谢您的帮助。

最佳答案

看来您的查询走在正确的轨道上 - 您只需要添加聚合即可:

SELECT Vehicle.id,vehicle.registrationMark, vehicle.status
, Max(RoadTax.Expiry) as LatestTax_Exp
, Max(MOT.Expiry) as LatestMOT_Exp
FROM Vehicle
LEFT JOIN RoadTax ON Vehicle.id = RoadTax.VehicleID
LEFT JOIN MOT ON Vehicle.id = MOT.VehicleID;
group by vehicle.ID, vehicle.Registrationmark, vehicle.status

或者,如果我误解了您想要的内容并且车辆可以有多个状态或注册,请尝试:

SELECT Vehicle.id,vehicle.registrationMark, vehicle.status
, Max(RoadTax.Expiry) over (partition by Vehicle.ID) as LatestRT_Exp
, Max(MOT.Expiry) over (partition by Vehicle.ID) as LatestMOT_Exp
FROM Vehicle
LEFT JOIN RoadTax ON Vehicle.id = RoadTax.VehicleID
LEFT JOIN MOT ON Vehicle.id = MOT.VehicleID;

关于mysql - 返回左表中的所有行,即使右表中没有记录以及右表中的最大到期日期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29710890/

相关文章:

mysql - 选择时在 MySQL 中解析 JSON

mysql - 是MYSQL的表关系错误吗?

sql-server - 无法使用sequelize 连接到SQL Azure 数据库,但本地主机上的SQL Server 工作正常

mysql - 在 MySQL 查询响应中用 Null 替换重复值

mysql - 从表 mysql 中获取重复条目

mysql - 数据库查询限制

php - mysql group by and preferred field = 1 in join table

sql - 在 SQL Server 中查找是否有包含 null 的列

sql - 将 GUID 转换为 varchar(32)

sql-server - 是否可以更改Azure弹性池服务器版本