SQL 加入另一个 SQL 查询
SQL Join another SQL Query
我已经设法组合了一个 SCCM 和 MDT 查询,它根据默认网关为我提供了过去 7 天内安装在特定位置的计算机。
我还设法加入了来自另一个 table.
的信息
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
Q2 显示红色错误见附图:
在“订购”处:
错误信息:
解决方案
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
您似乎缺少可以加入的领域。另外,我怀疑您要做的是为每个资源添加集合名称(如果集合名称存在)。尝试将您的第二个查询更改为...
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%确定这段代码。
我使用了 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 -->
我已经设法组合了一个 SCCM 和 MDT 查询,它根据默认网关为我提供了过去 7 天内安装在特定位置的计算机。 我还设法加入了来自另一个 table.
的信息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
Q2 显示红色错误见附图:
在“订购”处:
错误信息:
解决方案
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
您似乎缺少可以加入的领域。另外,我怀疑您要做的是为每个资源添加集合名称(如果集合名称存在)。尝试将您的第二个查询更改为...
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%确定这段代码。
我使用了 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 -->