Domanda

I have an SQL question based on below table structure. Database is currently in MS Access, with plans to migrate to SQL Server. Query should work in both DBMS'es.

I want to get devName and the latest dswSW_Version, based on dswTimestamp, for the device in question. If no SW history exists, I want to just return the devName.

The closest I could get was:

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

But nothing is returned for devid = 2, due to MAX returning null. I want to return Apple, null.

Is there a way to construct this statement without using a UNION and still return devname even if no SW history exists ?

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

Thank you !

È stato utile?

Soluzione 2

On SQL Server, a simple subquery should do the trick:

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

This will return all the device names from device, even those that does not have an entry in device_sw_history.

Altri suggerimenti

Just put your condition in the on clause:

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

For inner joins the on and where clauses are identical, and putting a condition in one or the other is merely a question of style and readability. Outer joins introduce a difference between on and where, the on clause only applies to one table, while the where clause applies to their combination.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top