簡體   English   中英

SQL兩個JOINS同一個表不同的值

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM