Sql-Server
當 Table1 在它的幾個欄位上與 Table2 有關係時,如何創建一個 VIEW?
我的情況(大大簡化)如下:
表格1
- ID
- Name
- 版本 1
- 版本 2
- 版本 3
- 版本 4
表2
- ID
- Name
- …
此表包含版本
列
Ver1
-Ver4
是外鍵,是ID
sTable2
行。我想創建一個
viewTable1
將顯示Name
fromTable1
,然後顯示所有版本的名稱 fromTable2
。我能想到的一種糟糕的方法是簡單地將
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
理想情況下,您會規範化您的數據。如果你不能做到這一點,那麼至少有兩種方法可以做到這一點。
您可以在此處查看這些簡化查詢的執行計劃。
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]