Sql-Server

當 Table1 在它的幾個欄位上與 Table2 有關係時,如何創建一個 VIEW?

  • August 28, 2019

我的情況(大大簡化)如下:

表格1

  • ID
  • Name
  • 版本 1
  • 版本 2
  • 版本 3
  • 版本 4

表2

  • ID
  • Name

此表包含版本

Ver1-Ver4是外鍵,是IDsTable2行。

我想創建一個viewTable1將顯示Namefrom Table1,然後顯示所有版本的名稱 from Table2

我能想到的一種糟糕的方法是簡單地將SELECT查詢一個一個地包裝起來,每次都Name通過一個JOIN. 但必須有更聰明的方法。

最簡單的方法是什麼?

數據範例和所需的視圖輸出:

表格1

ID  | Name | Ver1 | Ver2 | Ver3 | Ver4 
-----+------+------+------+------+------
01  | AAAA |  05  |  01  |  04  |  03 

表2

ID | Name     | ...
---+----------+------ 
01 | NameOfV1 | ...
02 | NameOfV2 | 
03 | NameOfV3 | 
04 | NameOfV4 | 
05 | NameOfV5 | 

SQL 語句查詢視圖

SELECT From ViewTable1 WHERE ID=1" 

上面的查詢應該返回這個記錄集:

01 AAAA NameOfV5 NameOfV1 NameOfV4 NameOfV3

理想情況下,您會規範化您的數據。如果你不能做到這一點,那麼至少有兩種方法可以做到這一點。

兩個例子的 DB FIDDLE

您可以在此處查看這些簡化查詢的執行計劃。

UNPIVOT > JOIN > PIVOT 方法

一種方法是先到UNPIVOT您的Table1,然後JOIN再到Table2,然後再PIVOT回到單行。

declare @Table1 table(ID int, [Name] varchar(16), Ver1 int, Ver2 int, Ver3 int, Ver4 int)

declare @Table2 table (ID int, [Name] varchar(16))

insert into @Table1
values
(1,'AAAA',5,1,4,3)

insert into @Table2
values
(1,'NameOfV1'),
(2,'NameOfV2'),
(3,'NameOfV3'),
(4,'NameOfV4'),
(5,'NameOfV5')


select
   ID
   ,BaseName
   ,[1] as Ver1
   ,[2] as Ver2
   ,[3] as Ver3
   ,[4] as Ver4
from
(
   select
       u.ID
       ,u.[Name] BaseName
       ,t2.[Name] VersionName
       ,RN = row_number() over ( partition by u.ID order by (select null))
   from 
       (
       select ID, [Name], Ver1, Ver2, Ver3, Ver4
       from @Table1 t1
       ) s
   unpivot
       (
       FKID for FKIDs in (Ver1, Ver2, Ver3, Ver4)
       ) u
   inner join
       @Table2 t2 on t2.ID = FKID
   ) s
pivot
   (
   max(VersionName) for RN in ([1],[2],[3],[4])
   ) p

Multi-Self-JOIN聚合方法

同樣,您可以只JOIN使用 4 次,並使用聚合函式。

select
   t.ID
   ,t.[Name]
   ,Ver1 = max(t1.Name)
   ,Ver2 = max(t2.Name)
   ,Ver3 = max(t3.Name)
   ,Ver4 = max(t4.Name)
from @Table1 t
inner join
   @Table2 t1 on t1.ID = t.Ver1
inner join
   @Table2 t2 on t2.ID = t.Ver2
inner join
   @Table2 t3 on t3.ID = t.Ver3
inner join
   @Table2 t4 on t4.ID = t.Ver4
group by
   t.ID
   ,t.[Name]

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