将SQL从SQL源更新为仅在非NULL时更新字段

时间:2018-01-10 16:24:17

标签: sql sql-server excel

我在SQL中有一个资产管理脚本,用于搜索显示过去90天内在设备上报告的特定软件版本的所有设备。然后,这些设备与某个位置相关联的资源相关联,并且通过此关联最好地定位设备。

我面临的问题是,因为它们是“浮动”设备,它们可能并非都必须同时使用,并且它们的关联可能会被同一资源使用的不同设备覆盖(因此{相关表格上的{1}}。最后,我希望能够跟踪这些设备的“上次查看位置”,如果不是LEFT OUTER JOIN则更新,但不会使用NULL覆盖非NULL值(所以该表在一段时间内迭代填充资源和位置详细信息。)

现在,因为并非所有同事都可以访问SQL,但需要知道这些信息,我想将信息提取到运行时更新的Excel电子表格中。为了逐步填充此信息,我尝试设置单独的条件列,如果它们不是NULL,则仅从CurrentResourceNameCurrentLocationName更新,但我看不出任何方式设置这些条件,而不是最终用NULL覆盖任何现有信息。

此链接运行的查询如下:

NULL

任何人都可以告诉我这是否可能吗?

1 个答案:

答案 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