在返回值之前检查所有关联的记录

时间:2018-05-04 11:29:00

标签: sql sql-server ssms sccm wql

所以,我试图在SCCM中创建一个我想给我的收藏品 没有链接到name0文件的资产列表(.ide)比新版本更新 21天。一旦确定,我就可以去调查为什么这些资产没有更新。

到目前为止,我已经在SSMS中编写了以下查询,然后才在SCCM中进行设置, 但很明显,这不是正确的做法。

SELECT DISTINCT v_GS_SYSTEM.Name0

FROM v_GS_SYSTEM inner join v_GS_SoftwareFile 
    ON v_GS_SoftwareFile.ResourceID = v_GS_SYSTEM.ResourceID

WHERE (DATEDIFF(day, v_GS_SoftwareFile.ModifiedDate, getdate()) >=21)

       AND NOT

      (DATEDIFF(day, v_GS_SoftwareFile.ModifiedDate, getdate()) <=21)

      AND
      v_GS_SoftwareFile.FileName like '/%.ide/'

ORDER BY v_GS_SYSTEM.Name0;

此代码返回&#34;正确&#34;价值但不考虑资产可能的事实 仍然有与之相关的较新的ide文件,这违背了本练习的目的。

所以(我想!)我的问题是,有没有办法检查Name0是否有任何关联的ModifiedDate记录 是否超过21天,如果此检查返回true / false,则仅返回一个值?

编辑:编辑@MatBailie回答输出: enter image description here

2 个答案:

答案 0 :(得分:0)

您可以在其中添加一个额外的EXISTS子句。

我相信您尝试撰写的查询是:

SELECT DISTINCT vs.Name0
    , vsf.FilePath
    , vsf.FileName
FROM v_GS_SYSTEM vs
INNER JOIN v_GS_SoftwareFile vsf
    ON vsf.ResourceID = vs.ResourceID
WHERE (DATEDIFF(day, vsf.ModifiedDate, getdate()) >= 21)
    AND NOT (DATEDIFF(day, vsf.ModifiedDate, getdate()) <= 21) -- this seems a bit redundant and might even exclude some rows where the result is exactly (21 * 24) hours
    AND vsf.FileName LIKE '/%.ide/'
    AND NOT EXISTS (
        SELECT 1
        FROM v_GS_SoftwareFile vsf2
        WHERE vsf2.ModifiedDate > GETDATE() - 21
            AND vsf2.ResourceId = vsf.ResourceId
        )
ORDER BY vs.Name0;

您可以通过保留或删除TRUE中的FALSE来更改NOT / AND NOT EXISTS支票。

修改

由于您提到了性能问题,请检查您是否有非群集的idex:

  • 在v_GS_SoftwareFile表中的ResourceId列上(我真的希望这不是一个视图,但是v_一开始就让我觉得这个是。)
  • 在v_GS_SYSTEM表中的ResourceID列上(此处相同的评论

答案 1 :(得分:0)

要将所有'*.ide'个文件加入其资源,但仅限于过去21天内未修改任何'*.ide'个文件的资源...

SELECT
    s.Name0,
    f.FilePath,
    f.FileName
FROM
(
    SELECT
        *,
        MAX(ModifiedDate) OVER (PARTITION BY ResourceID)   AS ResourceMaxModifiedDate
    FROM
        v_GS_SoftwareFile
    WHERE
        FileName LIKE '%.ide'
)
    AS f
INNER JOIN
    v_GS_SYSTEM         AS s
        ON  s.ResourceID =  f.ResourceID
WHERE
    f.ResourceMaxModifiedDate <= DATEADD(DAY, -21, GETDATE())
ORDER BY
    s.Name0,
    f.FilePath,
    f.FileName

获取过去21天内未修改'*.ide'个文件的所有资源...

SELECT
    s.Name0
FROM
    v_GS_SYSTEM         AS s
WHERE
    NOT EXISTS (
      SELECT *
        FROM v_GS_SoftwareFile    AS f
       WHERE f.FileName     LIKE '%.ide'
         AND f.ResourceID     =  s.ResourceID
         AND f.ModifiedDate  >=  DATEADD(DAY, -21, GETDATE())
    )
ORDER BY
    s.name0

根据您最终得到的查询,考虑这些表上的索引。覆盖指数超过(ResourceID, ModifiedDate)会很有用。并且文件类型的标志也是有用的LIKE '*.ide'将要求扫描行以找到匹配,它不能用典型的索引来解决)