SQL外连接结合右表中的MAX函数

Posted

技术标签:

【中文标题】SQL外连接结合右表中的MAX函数【英文标题】:SQL outer join in combination with MAX function in right table 【发布时间】:2014-01-01 02:47:39 【问题描述】:

我有一个基于下表结构的 SQL 问题。 数据库目前在 MS Access 中,并计划迁移到 SQL Server。查询应该在两个 DBMS 中都可以工作。

我想根据 dswTimestamp 获取相关设备的 devName 和最新的 dswSW_Version。如果不存在 SW 历史记录,我只想返回 devName。

我能得到的最接近的是:

SELECT dev.devname, dsw1.dswsw_version
FROM device_sw_history AS dsw1 RIGHT JOIN device AS dev 
ON dsw1.dswdevid = dev.devid
WHERE dsw1.dswtimestamp = (SELECT MAX(dswtimestamp) FROM device_sw_history AS dsw2 WHERE dsw1.dswdevid = dsw2.dswdevid)
AND devid = @devid

但由于 MAX 返回 null,因此 devid = 2 没有返回任何内容。我想返回 Apple,null。

有没有办法在不使用 UNION 的情况下构造此语句,并且即使不存在 SW 历史记录仍返回 devname ?

Device:
devid   devname
1       Samsung
2       Apple

Device_SW_History:
dswid   dswdevid  dswtimestamp    dswsw_version
1       1         5/dec/13        One
2       1         6/dec/13        Two

谢谢!

【问题讨论】:

如果您添加信息您正在使用的 DBMS 可能会有所帮助。 您需要的信息取决于您使用的数据库。用这个完成你的问题。 抱歉没提。添加了 DBMS:最好是 Access 和 SQL Server。访问仅限于它所理解的内容。 【参考方案1】:

只需将您的条件放在 on 子句中即可:

SELECT dev.devname, dsw1.dswsw_version
FROM device_sw_history AS dsw1 RIGHT JOIN device AS dev 
ON dsw1.dswdevid = dev.devid
AND dsw1.dswtimestamp = (SELECT MAX(dswtimestamp) FROM device_sw_history AS dsw2 WHERE dsw1.dswdevid = dsw2.dswdevid)
WHERE devid = @devid

对于内连接,on 和 where 子句是相同的,在其中一个或另一个中放置一个条件仅仅是样式和可读性的问题。外连接引入了on和where的区别,on子句只适用于一个表,而where子句适用于它们的组合。

【讨论】:

很遗憾,这会导致 Access 出现语法错误。可能是括号问题,但我还没有弄清楚哪里出了问题。对我来说似乎可以,但不能访问。不过感谢您的建议。【参考方案2】:

在 SQL Server 上,一个简单的子查询就可以解决问题:

SELECT
    devname, 
    (SELECT TOP 1 dswsw_version FROM device_sw_history WHERE dswdevid = devid
     ORDER BY dswtimestamp DESC)
FROM device

这将返回设备中的所有设备名称,即使是那些在 device_sw_history 中没有条目的设备。

【讨论】:

不知道为什么我认为 Access 不支持 SELECT 子句中的子查询,但它确实支持。谢谢你让我试试这个!不过,我需要 device_sw_history 表中的更多字段,并且需要弄清楚如何做到这一点。 您可以为您需要的每个字段重复整个子查询,也可以使用上述 unique2 的方法。 谢谢 Dan,我已将您的答案标记为答案。多子查询方法是我迄今为止唯一可以使用的方法。 unique2 的方法是在 Access 中出现语法错误,我似乎无法弄清楚原因。

以上是关于SQL外连接结合右表中的MAX函数的主要内容,如果未能解决你的问题,请参考以下文章

左外连接和右外连接的区别

一张图看懂Mysql的join连接

每组右表的左外连接?

如何使用 PHP、SQL 和 Microsoft Access 将另一个表中的 select max 函数和用户输入的变量插入表中?

SQL中有几种连接?有啥区别?(左连右连内连和外连?)

sql中的join使用