Reputation: 364
I am making multiple inner join:s in order to get data out of database. Depending on what RelationshipType I choose to use the outcome changes.
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'
AND
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'
The value I want on both above JOINs is in BMEt.Name.
Iv'e tried to just change the names BMEt to BMEt2, RT to RT2 for the second one and hoped that would do it. But then I get no data. (no errors just no data)
I've also tried to use IN like this:
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')
I then get both values but in the same column obviously. Is it possible to split this into two columns or how should I retrieve the data?
FULL QUERY
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
SECOND TRY
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
Gives Error:
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
NEW ERROR
Msg 207, Level 16, State 1, Line 40
Invalid column name 'Name'.
Completion time: 2021-06-24T13:58:13.3559097+02:00
Upvotes: 0
Views: 112
Reputation: 6750
You may also use pivot to turn rows to columns, if one RelationshipType
may have only one value:
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 with some simplified example is here
Upvotes: 1
Reputation: 1271003
If I understand correctly, you want two sets of joins:
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';
One note: Usually this is done using LEFT JOIN
rather than INNER JOIN
. Without sample data, desired results, and a clear explanation of the query logic it is a bit hard to say, but I'm pretty sure you need outer joins here.
Upvotes: 1