[英]SQL Two JOINS same table different values
我正在制作多個內部連接:s 以便從數據庫中獲取數據。 根據我選擇使用的關系類型,結果會發生變化。
INNER JOIN [SERVER01].[ServiceManager].[dbo].[BaseManagedEntity] AS BMEt ON rel.TargetEntityId = BMEt.BaseManagedEntityId
INNER JOIN [SERVER01].[ServiceManager].[dbo].[RelationshipType] AS RT ON rel.RelationshipTypeId = RT.RelationshipTypeId
AND RT.RelationshipTypeName = 'Cireson.AssetManagement.HardwareAssetHasLocation'
和
INNER JOIN [SERVER01].[ServiceManager].[dbo].[BaseManagedEntity] AS BMEt ON rel.TargetEntityId = BMEt.BaseManagedEntityId
INNER JOIN [SERVER01].[ServiceManager].[dbo].[RelationshipType] AS RT ON rel.RelationshipTypeId = RT.RelationshipTypeId
AND RT.RelationshipTypeName = 'Cireson.AssetManagement.HardwareAssetHasOrganization'
我想要的以上兩個 JOIN 的值都在 BMEt.Name 中。
我試圖將名稱 BMEt 更改為 BMEt2,將 RT 更改為第二個名稱,並希望這樣做。 但后來我沒有得到任何數據。 (沒有錯誤只是沒有數據)
我也試過像這樣使用 IN:
INNER JOIN [SERVER01].[ServiceManager].[dbo].[BaseManagedEntity] AS BMEt ON rel.TargetEntityId = BMEt.BaseManagedEntityId
INNER JOIN [SERVER01].[ServiceManager].[dbo].[RelationshipType] AS RT ON rel.RelationshipTypeId = RT.RelationshipTypeId
AND RT.RelationshipTypeName IN ('Cireson.AssetManagement.HardwareAssetHasOrganization','Cireson.AssetManagement.HardwareAssetHasLocation')
然后我得到兩個值,但顯然在同一列中。 是否可以將其拆分為兩列,或者我應該如何檢索數據?
完整查詢
DECLARE @OSBuild AS VARCHAR(100)='10.0.19042'
SELECT VRS.[ResourceID] AS 'ResourceID'
,VRS.[Name0] AS 'Computername'
,VRS.[Resource_Domain_OR_Workgr0] AS 'Domain'
,BIOS.SerialNumber0 AS 'Serialnumber'
,BMEt.Name AS 'Location'
FROM [SERVER02].[dbo].[v_R_System] as VRS
INNER JOIN [SERVER02].[dbo].[v_GS_OPERATING_SYSTEM] AS vGSOS on vGSOS.[ResourceID] = VRS.[ResourceID]
INNER JOIN [SERVER02].[dbo].v_GS_PC_BIOS AS BIOS ON BIOS.[ResourceID] = VRS.[ResourceID]
INNER JOIN [SERVER01].[ServiceManager].[dbo].[MT_Cireson$AssetManagement$HardwareAsset] AS HWA ON BIOS.SerialNumber0 = HWA.SerialNumber_C8CF2E89_7A83_1C26_0AD0_887DF9140D5A COLLATE SQL_Latin1_General_CP1_CI_AS
INNER JOIN [SERVER01].[ServiceManager].[dbo].relationship AS rel ON rel.SourceEntityId = HWA.BaseManagedEntityId
INNER JOIN [SERVER01].[ServiceManager].[dbo].[BaseManagedEntity] AS BMEt ON rel.TargetEntityId = BMEt.BaseManagedEntityId
INNER JOIN [SERVER01].[ServiceManager].[dbo].[RelationshipType] AS RT ON rel.RelationshipTypeId = RT.RelationshipTypeId
AND RT.RelationshipTypeName IN ('Cireson.AssetManagement.HardwareAssetHasOrganization','Cireson.AssetManagement.HardwareAssetHasLocation')
WHERE VRS.Operating_System_Name_and0 NOT LIKE '%Server%' AND
vGSOS.[Version0] = @OSBuild
ORDER BY BIOS.SerialNumber0 ASC
第二次嘗試
DECLARE @OSBuild AS VARCHAR(100)='10.0.19042';
with a as (
SELECT
VRS.[ResourceID] AS [ResourceID]
, VRS.[Name0] AS [Computername]
, VRS.[Resource_Domain_OR_Workgr0] AS [Domain]
, BIOS.SerialNumber0 AS [Serialnumber]
, case RT.RelationshipTypeName
when 'Cireson.AssetManagement.HardwareAssetHasOrganization'
then 'Organization'
when 'Cireson.AssetManagement.HardwareAssetHasLocation'
then 'Location'
end as RelTypeName
, BMEt.Name
FROM [SERVER02].[dbo].[v_R_System] as VRS
JOIN [SERVER02].[dbo].[v_GS_OPERATING_SYSTEM] AS vGSOS
ON vGSOS.[ResourceID] = VRS.[ResourceID]
JOIN [SERVER02].[dbo].v_GS_PC_BIOS AS BIOS
ON BIOS.[ResourceID] = VRS.[ResourceID]
JOIN [SERVER01].[ServiceManager].[dbo].[MT_Cireson$AssetManagement$HardwareAsset] AS HWA
ON BIOS.SerialNumber0 = HWA.SerialNumber_C8CF2E89_7A83_1C26_0AD0_887DF9140D5A COLLATE SQL_Latin1_General_CP1_CI_AS
JOIN [SERVER01].[ServiceManager].[dbo].relationship AS rel
ON rel.SourceEntityId = HWA.BaseManagedEntityId
JOIN [SERVER01].[ServiceManager].[dbo].[RelationshipType] AS RT
ON rel.RelationshipTypeId = RT.RelationshipTypeId
AND RT.RelationshipTypeName IN ('Cireson.AssetManagement.HardwareAssetHasOrganization','Cireson.AssetManagement.HardwareAssetHasLocation')
JOIN [SERVER01].[ServiceManager].[dbo].[BaseManagedEntity] AS BMEt
ON rel.TargetEntityId = BMEt.BaseManagedEntityId
WHERE VRS.Operating_System_Name_and0 NOT LIKE '%Server%'
AND vGSOS.[Version0] = @OSBuild
)
select *
from a
pivot (
max(Name) for RelTypeName in (
[Location],
[Organization]
)
) as q
ORDER BY [Serialnumber] ASC
給出錯誤:
Msg 319, Level 15, State 1, Line 3
Incorrect syntax near the keyword 'with'. If this statement is a common table expression, an xmlnamespaces clause or a change tracking context clause, the previous statement must be terminated with a semicolon.
Completion time: 2021-06-24T13:37:17.2405171+02:00
新錯誤
Msg 207, Level 16, State 1, Line 40
Invalid column name 'Name'.
Completion time: 2021-06-24T13:58:13.3559097+02:00
如果我理解正確,您需要兩組連接:
INNER JOIN
[SERVER01].[ServiceManager].[dbo].[BaseManagedEntity] BMEt
ON rel.TargetEntityId = BMEt.BaseManagedEntityId INNER JOIN
[SERVER01].[ServiceManager].[dbo].[RelationshipType] RT
ON rel.RelationshipTypeId = RT.RelationshipTypeId AND
RT.RelationshipTypeName = 'Cireson.AssetManagement.HardwareAssetHasOrganization' INNER JOIN
[SERVER01].[ServiceManager].[dbo].[BaseManagedEntity] BMEt2
ON rel2.TargetEntityId = BMEt2.BaseManagedEntityId INNER JOIN
[SERVER01].[ServiceManager].[dbo].[RelationshipType] RT2
ON rel.RelationshipTypeId = RT2.RelationshipTypeId AND
RT2.RelationshipTypeName = 'Cireson.AssetManagement.HardwareAssetHasLocation';
一個注意事項:通常這是使用LEFT JOIN
而不是INNER JOIN
。 如果沒有示例數據、所需的結果和對查詢邏輯的清晰解釋,這有點難說,但我很確定您在這里需要外連接。
如果一個RelationshipType
可能只有一個值,您也可以使用pivot將行轉換為列:
with a as (
SELECT
VRS.[ResourceID] AS [ResourceID]
, VRS.[Name0] AS [Computername]
, VRS.[Resource_Domain_OR_Workgr0] AS [Domain]
, BIOS.SerialNumber0 AS [Serialnumber]
, case RT.RelationshipTypeName
when 'Cireson.AssetManagement.HardwareAssetHasOrganization'
then 'Organization'
when 'Cireson.AssetManagement.HardwareAssetHasLocation'
then 'Location'
end as RelTypeName
, BMEt.Name
FROM [SERVER02].[dbo].[v_R_System] as VRS
JOIN [SERVER02].[dbo].[v_GS_OPERATING_SYSTEM] AS vGSOS
on vGSOS.[ResourceID] = VRS.[ResourceID]
JOIN [SERVER02].[dbo].v_GS_PC_BIOS AS BIOS
ON BIOS.[ResourceID] = VRS.[ResourceID]
JOIN [SERVER01].[ServiceManager].[dbo].[MT_Cireson$AssetManagement$HardwareAsset] AS HWA
ON BIOS.SerialNumber0 = HWA.SerialNumber_C8CF2E89_7A83_1C26_0AD0_887DF9140D5A COLLATE SQL_Latin1_General_CP1_CI_AS
JOIN [SERVER01].[ServiceManager].[dbo].relationship AS rel
ON rel.SourceEntityId = HWA.BaseManagedEntityId
JOIN [SERVER01].[ServiceManager].[dbo].[RelationshipType] AS RT
ON rel.RelationshipTypeId = RT.RelationshipTypeId
AND RT.RelationshipTypeName IN ('Cireson.AssetManagement.HardwareAssetHasOrganization','Cireson.AssetManagement.HardwareAssetHasLocation')
JOIN [SERVER01].[ServiceManager].[dbo].[BaseManagedEntity] AS BMEt
ON rel.TargetEntityId = BMEt.BaseManagedEntityId
WHERE VRS.Operating_System_Name_and0 NOT LIKE '%Server%'
AND vGSOS.[Version0] = @OSBuild
)
select *
from a
pivot (
max(Name) for RelTypeName in (
[Location],
[Organization]
)
) as q
ORDER BY [Serialnumber] ASC
db<>fiddle 有一些簡化的例子在這里
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.