2010-06-16 30 views
3

所以我不一定說這是一個好主意,如果可能的話,因爲視圖的模式是非常不穩定的,但是有沒有什麼方法可以在單個視圖中表示多種關係?是否可以編寫包含一對多關係的數據庫視圖?

例如,假設我有一個客戶可以在數據庫中擁有任意數量的地址。有沒有什麼辦法可以列出每個地址的每一列,也許是一個數字作爲別名的一部分(例如,像客戶ID,名稱,地址_街道_1,地址_街道_2等等)?

謝謝!

+0

只是要說清楚,我指的是有一個客戶表和一個地址表,並且地址表有一個客戶ID引用(外鍵關係)的場景 – 2010-06-16 16:35:41

回答

3

不是真的 - 你真的在做一個動態的關鍵。可以使用OPENROWSET來獲取動態生成的查詢,但是否這是明智的,在沒有詳細瞭解業務案例的情況下很難說。

第一個make a stored proc which does the dynamic pivot就像我在StackExchange Data Explorer中做的那樣。

基本上,您將生成構建列列表的動態SQL。這隻能在存儲過程中完成。對於應用電話來說很好。

但是如果你想在很多不同的連接或即席查詢中重複使用它,怎麼辦?

然後,看看this article:「使用SQL服務器OPENROWSET打破規則」

您現在可以通過循環回服務器,然後得到的結果爲行集調用你的存儲過程 - 這可以在視圖中!

已故的Ken Henderson在his excellent book有一些很好的例子:「SQL Server存儲過程,XML和HTML的大師指南」(你必須喜歡捕獲封面上的小「封面.NET!」以及2002年的時代精神!)。

他只涵蓋了回送部分(包含視圖和用戶定義的函數),但在2005年之前,沒有詳細的PIVOT語法,但是也可以使用CASE語句生成PIVOTs,如a characteristic function

顯然,這種技術有一些警告(我甚至無法在我們的生產服務器上這樣做)。

+0

謝謝......你有什麼例子說明在這種情況下動態的pivot/OPENROWSET是什麼意思? – 2010-06-17 12:53:51

+1

@Brandon Linton擴大了我的答案 – 2010-06-17 15:06:06

+0

感謝凱德......我認爲這是我最想知道的內容。 – 2010-06-17 17:10:51

3

是 - 使用:

CREATE VIEW customer_addresses AS 
    SELECT t.customer_id, 
      t.customer_name, 
      a1.street AS address_street_1, 
      a2.street AS address_street_2 
     FROM CUSTOMER t 
LEFT JOIN ADDRESS a1 ON a1.customer_id = t.customer_id 
LEFT JOIN ADDRESS a2 ON a2.customer_id = t.customer_id 

如果你提供更多的信息,它會更容易給你一個更好的答案。您可能希望旋轉數據(將行轉爲列)。

+0

你基本上是「反規範化」結構,這對報告工具通常很有用。 – 2010-06-16 16:22:30

+0

對不起,我指的是有兩張表格,客戶和地址,地址中有客戶ID。 – 2010-06-16 16:31:05

+0

此視圖是否暗示客戶的地址位於兩個不同的表(a1和a2)中? – 2010-06-16 16:39:10

3

簡而言之,沒有。每次你至少要使用它的時候,都不要動態地重新創建視圖,也就是說。

但是,你可以可以做的是在你的視圖中預定義4個地址列,然後將你的一對多關係的前四個結果填充到這些列中。這不完全是你想要的動態視圖,但我認爲它也更加穩定/可用。