【问题标题】:SQL Join another SQL QuerySQL 加入另一个 SQL 查询
【发布时间】:2021-08-30 09:59:34
【问题描述】:

我已经设法根据默认网关对 SCCM 和 MDT 进行了查询,该查询为我提供了过去 7 天安装在特定位置的计算机。 我还设法从另一个表中加入信息。

SELECT DH.[ResourceID]
      ,DH.[Computername]
      ,DH.[AssetTag]
      ,DH.[Serialnumber]
      ,DH.[Manufacturer]
      ,DH.[Model]
      ,DH.[Role]
      ,DH.[StartTime]
      ,DH.[EndTime]
      ,DH.[DefaultGateway]
      ,CIL.[Username]
FROM [MDT].[dbo].[DeploymentHistory] DH
LEFT JOIN [MDT].[dbo].[ComputerImportLog] CIL ON DH.[Computername] = CIL.[Computername]
    WHERE [StartTime] BETWEEN dateadd(day,-7,getdate()) and getdate() AND 
        (DH.[DefaultGateway] = '192.168.10.1' OR DH.[DefaultGateway] = '192.168.20.1')
            ORDER BY Starttid DESC

我现在要做的是添加另一个基于 SCCM OSD 集合的列。 我有一个工作代码,可以为我提供这些集合中的所有设备

SELECT COL.Name FROM v_R_System SD
JOIN v_FullCollectionMembership FCM ON SD.ResourceID = FCM.ResourceID
JOIN v_Collection COL ON FCM.CollectionID = COL.CollectionID
WHERE (COL.CollectionID = 'XXXXXXX1' OR COL.CollectionID = 'XXXXXXX2' OR COL.CollectionID = 'XXXXXXX3')

运行我的第二个查询给我这样的输出:

但是,我尝试将其与上述内容结合起来,它既没有给我任何东西,也没有给我太多的设备。 问题是我现在不知道如何合并它并仍然保留过滤器(WHERE-section)

我试过的一个例子是:

SELECT DH.[ResourceID]
      ,DH.[Computername]
      ,DH.[HBGAssetTag]
      ,DH.[Serialnumber]
      ,DH.[Manufacturer]
      ,DH.[Model]
      ,DH.[Role]
      ,DH.[StartTime]
      ,DH.[EndTime]
      ,DH.[DefaultGateway]
      ,CIL.[Username]
      ,COL.[Name]
FROM [MDT].[dbo].[DeploymentHistory] DH
JOIN [v_FullCollectionMembership] FCM ON DH.[ResourceID] = FCM.[ResourceID]
JOIN [v_Collection] COL ON DH.[ResourceID] = COL.[CollectionID]
LEFT JOIN [MDT].[dbo].[ComputerImportLog] CIL ON DH.[Computername] = CIL.[Computername]
    WHERE [StartTime] BETWEEN dateadd(day,-7,getdate()) and getdate() AND 
        (DH.[DefaultGateway] = '192.168.10.1' OR DH.[DefaultGateway] = '192.168.20.1') AND
            (COL.[CollectionID] = 'XXXXXXX1' OR COL.[CollectionID] = 'XXXXXXX2' OR COL.[CollectionID] = 'XXXXXXX3')

这给了我这个错误:

Msg 245, Level 16, State 1, Line 1
Conversion failed when converting the nvarchar value 'XXXXXXX1' to data type int.

Completion time: 2021-06-14T15:05:41.5142960+02:00

我尝试创建另一个 LEFT JOIN 并添加来自那个的数据,但这也不起作用。我需要像在原始查询中那样进行整理。

谁能指出我正确的方向?

第二次尝试

SELECT DH.[ResourceID]
      ,DH.[Computername]
      ,DH.[HBGAssetTag]
      ,DH.[Serialnumber]
      ,DH.[Manufacturer]
      ,DH.[Model]
      ,DH.[Role]
      ,DH.[StartTime]
      ,DH.[EndTime]
      ,DH.[DefaultGateway]
      ,CIL.[Username]
      ,COL.[Name]
FROM [MDT].[dbo].[DeploymentHistory] DH
JOIN [v_FullCollectionMembership] FCM ON DH.[ResourceID] = FCM.[ResourceID]
JOIN [v_Collection] COL ON FCM.[CollectionID] = COL.[CollectionID]
LEFT JOIN [MDT].[dbo].[ComputerImportLog] CIL ON DH.[Computername] = CIL.[Computername]
    WHERE [StartTime] BETWEEN dateadd(day,-7,getdate()) and getdate() AND 
        (DH.[DefaultGateway] = '192.168.10.1' OR DH.[DefaultGateway] = '192.168.20.1') AND
            (COL.[CollectionID] = 'XXXXXXX1' OR COL.[CollectionID] = 'XXXXXXX2' OR COL.[CollectionID] = 'XXXXXXX3')

第三次尝试

SELECT Q1.[ResourceID]
, Q1.[Computername]
, Q1.[AssetTag]
, Q1.[Serialnumber]
, Q1.[Manufacturer]
, Q1.[Model]
, Q1.[Role]
, Q1.[StartTime]
, Q1.[EndTime]
, Q1.[DefaultGateway]
, Q1.[Username]
, Q2.[Name] AS 'CollectionName'

FROM (
    SELECT DH.[ResourceID]
    , DH.[Computername]
    , DH.[AssetTag]
    , DH.[Serialnumber]
    , DH.[Manufacturer]
    , DH.[Model]
    , DH.[Role]
    , DH.[StartTime]
    , DH.[EndTime]
    , DH.[DefaultGateway]
    , CIL.[Username]
    
    FROM [MDT].[dbo].[DeploymentHistory] DH
      LEFT JOIN [MDT].[dbo].[ComputerImportLog] CIL ON DH.[Computername] = CIL.[Computername]
    WHERE [StartTime] BETWEEN dateadd(day,-7,getdate()) and getdate()
      AND DH.[DefaultGateway] IN ('192.168.10.1', '192.168.20.1')
  ) Q1
  LEFT OUTER JOIN (
    SELECT SD.[ResourceID]
    , COL.Name 
    FROM [v_R_System] SD
      INNER JOIN [MDT].[dbo].[DeploymentHistory] DH ON SD.[ResourceID] = DH.[ResourceID]
      INNER JOIN [v_FullCollectionMembership] FCM ON SD.[ResourceID] = FCM.ResourceID
      INNER JOIN [v_Collection] COL ON FCM.[CollectionID] = COL.[CollectionID]
    WHERE COL.[CollectionID] in ('XXXXXXX1', 'XXXXXXX2', 'XXXXXXX3')
  ) Q2

ORDER BY DH.[StartTime] DESC

在第二季度显示红色错误见附图:

在“订单”处:

错误信息:

解决方案

SELECT Q1.[ResourceID]
,Q1.[Computername]
,Q1.[AssetTag]
,Q1.[Serialnumber]
,Q1.[Manufacturer]
,Q1.[Model]
,Q1.[Role]
,Q1.[StartTime]
,Q1.[EndTime]
,Q1.[DefaultGateway]
,Q1.[Username]
,Q2.[Name] AS 'CollectionName'

FROM (
    SELECT DH.[ResourceID]
    ,DH.[Computername]
    ,DH.[HBGAssetTag]
    ,DH.[Serialnumber]
    ,DH.[Manufacturer]
    ,DH.[Model]
    ,DH.[Role]
    ,DH.[StartTime]
    ,DH.[EndTime]
    ,DH.[DefaultGateway]
    ,CIL.[Username]
    
    FROM [MDT].[dbo].[DeploymentHistory] DH
      LEFT JOIN [MDT].[dbo].[ComputerImportLog] CIL ON DH.[Computername] = CIL.[Computername]
    WHERE DH.[StartTime] BETWEEN dateadd(day,-7,getdate()) and getdate()
      AND DH.[DefaultGateway] IN ('192.168.10.1', '192.168.20.1')
  ) AS Q1

LEFT OUTER JOIN (
    SELECT SD.[ResourceID]
    ,COL.Name 
    FROM [v_R_System] SD
      INNER JOIN [v_FullCollectionMembership] FCM ON SD.[ResourceID] = FCM.[ResourceID]
      INNER JOIN [v_Collection] COL ON FCM.[CollectionID] = COL.[CollectionID]
    WHERE COL.[CollectionID] IN ('XXXXXXX1', 'XXXXXXX2', 'XXXXXXX3')
  ) AS Q2
  ON Q1.[ResourceID] = Q2.[ResourceID]

ORDER BY Q1.[StartTime] DESC

【问题讨论】:

  • 您确定第二个查询有效吗? DH.[ResourceID] 和 COL.[CollectionID] 的类型是什么?
  • 我用一张图片更新了我的问题,显示我的第二个查询独立工作。
  • 集合ID是什么类型?因为似乎在第三个查询中某些东西的转换方式不同。
  • 如果 XXXXXXX1 是一个数字,请尝试执行 CAST('XXXXXXX1' as int) 之类的操作
  • FCM- 和 COL.CollectionID 都是 nvarchar。它们包含字符和数字。

标签: sql sql-server join left-join


【解决方案1】:

您似乎缺少一个可以加入的领域。另外,如果集合名称存在,我怀疑您要尝试为每个资源添加集合名称。尝试将您的第二个查询更改为...

SELECT SD.ResourceID
, COL.Name 
FROM v_R_System SD
  INNER JOIN v_FullCollectionMembership FCM ON SD.ResourceID = FCM.ResourceID
  INNER JOIN v_Collection COL ON FCM.CollectionID = COL.CollectionID
WHERE COL.CollectionID in ('XXXXXXX1', 'XXXXXXX2', 'XXXXXXX3')

从那里,您可以组合查询。这是一种蛮力的简单方法:

SELECT Q1.[ResourceID]
, Q1.[Computername]
, Q1.[AssetTag]
, Q1.[Serialnumber]
, Q1.[Manufacturer]
, Q1.[Model]
, Q1.[Role]
, Q1.[StartTime]
, Q1.[EndTime]
, Q1.[DefaultGateway]
, Q1.[Username]
, Q2.[Name] AS 'CollectionName'

FROM (
    SELECT DH.[ResourceID]
    , DH.[Computername]
    , DH.[AssetTag]
    , DH.[Serialnumber]
    , DH.[Manufacturer]
    , DH.[Model]
    , DH.[Role]
    , DH.[StartTime]
    , DH.[EndTime]
    , DH.[DefaultGateway]
    , CIL.[Username]
    , Startid
    
    FROM [MDT].[dbo].[DeploymentHistory] DH
      LEFT JOIN [MDT].[dbo].[ComputerImportLog] CIL ON DH.[Computername] = CIL.[Computername]
    WHERE [StartTime] BETWEEN dateadd(day,-7,getdate()) and getdate()
      AND DH.[DefaultGateway] IN ('192.168.10.1', '192.168.20.1')
  ) Q1
  LEFT OUTER JOIN (
    SELECT SD.ResourceID
    , COL.Name 
    FROM v_R_System SD
      INNER JOIN v_FullCollectionMembership FCM ON SD.ResourceID = FCM.ResourceID
      INNER JOIN v_Collection COL ON FCM.CollectionID = COL.CollectionID
    WHERE COL.CollectionID in ('XXXXXXX1', 'XXXXXXX2', 'XXXXXXX3')
  ) Q2

ORDER BY Starttid DESC

这可以在不使用子查询的情况下完成,但这种记录您的思考过程。 (我想看到这个结果与那个结果相结合。)所以这是一个很好的起点。一旦你看到你寻找的结果,然后简化查询。

虽然并不总是需要,但最好对列进行限定。比如我不知道Startid是从哪里来的,所以我不能100%确定这段代码。

【讨论】:

  • 非常感谢!我相信我现在非常接近解决方案。尽管它最后给出了我的错误。 (请参阅我的原始帖子,如果我添加了“第三次尝试”并且它是错误的。Starttid 已被删除。我已经测试了很多并忘记删除它。
  • 我认为仍然存在的问题与“FROM (”部分有关。据我所知,FROM 部分在“) Q1”结束。但我无法弄清楚如何格式化它以将“LEFT OUTER JOIN”包含在 FROM 部分中,以便“) Q2”也可以工作。
  • 请提供一个 SQL 语句,该语句将生成一些基本数据以供使用并创建表语句。
【解决方案2】:

我使用了 dougp:s 的答案并设法让它发挥作用。

解决方案


<!-- begin snippet: -->

<!-- language: lang-sql -->

    SELECT Q1.[ResourceID]
        ,Q1.[Computername]
        ,Q1.[AssetTag]
        ,Q1.[Serialnumber]
        ,Q1.[Manufacturer]
        ,Q1.[Model]
        ,Q1.[Role]
        ,Q1.[StartTime]
        ,Q1.[EndTime]
        ,Q1.[DefaultGateway]
        ,Q1.[Username]
        ,Q2.[Name] AS 'CollectionName'

    FROM (
        SELECT DH.[ResourceID]
        ,DH.[Computername]
        ,DH.[HBGAssetTag]
        ,DH.[Serialnumber]
        ,DH.[Manufacturer]
        ,DH.[Model]
        ,DH.[Role]
        ,DH.[StartTime]
        ,DH.[EndTime]
        ,DH.[DefaultGateway]
        ,CIL.[Username]
        
        FROM [MDT].[dbo].[DeploymentHistory] DH
          LEFT JOIN [MDT].[dbo].[ComputerImportLog] CIL ON DH.[Computername] = CIL.[Computername]
        WHERE DH.[StartTime] BETWEEN dateadd(day,-7,getdate()) and getdate()
          AND DH.[DefaultGateway] IN ('192.168.10.1', '192.168.20.1')
        ) AS Q1

        LEFT OUTER JOIN (
        SELECT SD.[ResourceID]
        ,COL.Name 
        FROM [v_R_System] SD
          INNER JOIN [v_FullCollectionMembership] FCM ON SD.[ResourceID] = FCM.[ResourceID]
          INNER JOIN [v_Collection] COL ON FCM.[CollectionID] = COL.[CollectionID]
        WHERE COL.[CollectionID] IN ('XXXXXXX1', 'XXXXXXX2', 'XXXXXXX3')
        ) AS Q2
        ON Q1.[ResourceID] = Q2.[ResourceID]

        ORDER BY Q1.[StartTime] DESC

<!-- end snippet -->

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-08-21
    • 2018-07-02
    • 1970-01-01
    • 1970-01-01
    • 2010-10-08
    • 2018-06-14
    • 1970-01-01
    相关资源
    最近更新 更多