Sql-Server

mssql - 使用來自同一表和關聯表的結果進行查詢

  • April 19, 2022

我需要查詢幫助。

我有 3 張桌子:

  1. “零件”表。

這裡需要注意的一件重要事情是,parts 表包含主要部分和子部分。子零件是主要零件的組件。子元件使用列“MainPartId”連結到主元件

這是桌子

說明:

a)“變速器01”(Id值為1)和“電機01”(Id值為5)是主要元件。主要部分的“mainPartId”值始終為 0。CTypeId 為 1010

b) 2,3,4 行是“傳輸 01”的子部分,因此 MainPartId 為“1”(“傳輸 01”的 ID)。同樣,6 是“motor 01”的子部分

c) CType Id 不會針對給定的主要部分重複。即:從上表中,您將看到“齒輪 4324”具有 CTypeId od“441”。對於“傳輸 01”的任何子部分,這不會重複。但另一個主要部分 - 如“電機 01” - 可以有 CtypeId 為“441”的子部分,如表​​所示

  1. “設備”表

  2. “EquipmentPartAssoc”表

這是一個包含設備元件關聯的表

關於查詢和預期結果:

我想要的結果是列出所有 mainpart - childpart 組合以及每個設備的特定 CTypeId。

例如(如果我想要 CtypeId 441 和供應商 v1 的結果)

補充筆記:

  1. 我們不查詢 CTypeId 1010,所以不需要考慮這種情況
  2. 在這種情況下,表中只給出了 1 個供應商“V1”。但我希望你明白可以有很多供應商。

使用inner join,從Parts表開始,self join 獲取Parent的資訊。

select e.EquipmentNumber,
      p.PartNumber,
      ChildPartNumber = c.PartNumber,
      c.CTypeId,
      c.VendorId
from   Parts c   -- child
      inner join Parts p on c.MainPartId = p.Id    -- parent
      inner join EquipmentPartAssoc a on p.Id = a.PartId
      inner join Equipment e on e.Id = a.EquipmentId
where  c.CTypeId  = 441
and    c.VendorId = 'V1'

結果 :

db<>小提琴展示

引用自:https://dba.stackexchange.com/questions/311092