我在SQL中有一个资产管理脚本,用于搜索显示过去90天内在设备上报告的特定软件版本的所有设备。然后,这些设备与某个位置相关联的资源相关联,并且通过此关联最好地定位设备。
我面临的问题是,因为它们是“浮动”设备,它们可能并非都必须同时使用,并且它们的关联可能会被同一资源使用的不同设备覆盖(因此{相关表格上的{1}}。最后,我希望能够跟踪这些设备的“上次查看位置”,如果不是LEFT OUTER JOIN
则更新,但不会使用NULL
覆盖非NULL
值(所以该表在一段时间内迭代填充资源和位置详细信息。)
现在,因为并非所有同事都可以访问SQL,但需要知道这些信息,我想将信息提取到运行时更新的Excel电子表格中。为了逐步填充此信息,我尝试设置单独的条件列,如果它们不是NULL
,则仅从CurrentResourceName
或CurrentLocationName
更新,但我看不出任何方式设置这些条件,而不是最终用NULL
覆盖任何现有信息。
此链接运行的查询如下:
NULL
任何人都可以告诉我这是否可能吗?
答案 0 :(得分:1)
由于查询是当前运行时的实时数据闪存点,因此它们不会存储以前用作参考点的数据。
因此,请考虑使用SELECT ... INTO
命令保存历史表一次,然后从最新结果的视图中更新值。然后始终将历史表导出到Excel。
制作表格查询 (运行一次)
SELECT
md.DeviceName
, md.DeviceSerial
, md.ApplicationVersion
, md.CreateDate
, md.UpdateDate
, res.CurrentResourceName
, loc.CurrentLocationName
INTO myHistoricalTable
FROM [MobileDevice] md
LEFT OUTER JOIN [Resource] res ON res.ResourceID = md.ResourceID
LEFT OUTER JOIN [ResourceOwnership] rso ON res.ResourceID = rso.ResourceID
AND rso.OwnershipEnd IS NULL
LEFT OUTER JOIN [Location] loc ON loc.LocationID = rso.OwningLocationID
WHERE md.ApplicationVersion LIKE 'SomeVersion'
AND md.UpdateDate > (CURRENT_TIMESTAMP - 90)
ORDER BY loc.CurrentLocationName ASC
, md.CreateDate DESC
, md.UpdateDate DESC
创建视图 (运行一次)
CREATE VIEW myCurrentView
AS --<ORIGINAL SELECT QUERY>
更新查询 (定期加入表和视图)
UPDATE t
SET t.CurrentResourceName = CASE WHEN v.CurrentResourceName IS NOT NULL
THEN v.CurrentResourceName
ELSE t.CurrentResourceName
END,
t.CurrentLocationName = CASE WHEN v.CurrentLocationName IS NOT NULL
THEN v.CurrentLocationName
ELSE t.CurrentLocationName
END
FROM myHistoricalTable t
JOIN myCurrentView v
ON t.DeviceName = v.DeviceName
AND t.DeviceSerial = v.DeviceSerial
AND t.ApplicationVersion = v.ApplicationVersion
AND t.CreateDate = t.CreateDate
AND t.UpdateDate = v.UpdateDate
从Excel导出/导入 (在上述更新后定期运行)
SELECT * FROM myHistoricalTable