所以我不一定說這是一個好主意,如果可能的話,因爲視圖的模式是非常不穩定的,但是有沒有什麼方法可以在單個視圖中表示多種關係?是否可以編寫包含一對多關係的數據庫視圖?
例如,假設我有一個客戶可以在數據庫中擁有任意數量的地址。有沒有什麼辦法可以列出每個地址的每一列,也許是一個數字作爲別名的一部分(例如,像客戶ID,名稱,地址_街道_1,地址_街道_2等等)?
謝謝!
所以我不一定說這是一個好主意,如果可能的話,因爲視圖的模式是非常不穩定的,但是有沒有什麼方法可以在單個視圖中表示多種關係?是否可以編寫包含一對多關係的數據庫視圖?
例如,假設我有一個客戶可以在數據庫中擁有任意數量的地址。有沒有什麼辦法可以列出每個地址的每一列,也許是一個數字作爲別名的一部分(例如,像客戶ID,名稱,地址_街道_1,地址_街道_2等等)?
謝謝!
不是真的 - 你真的在做一個動態的關鍵。可以使用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。
顯然,這種技術有一些警告(我甚至無法在我們的生產服務器上這樣做)。
謝謝......你有什麼例子說明在這種情況下動態的pivot/OPENROWSET是什麼意思? – 2010-06-17 12:53:51
@Brandon Linton擴大了我的答案 – 2010-06-17 15:06:06
感謝凱德......我認爲這是我最想知道的內容。 – 2010-06-17 17:10:51
是 - 使用:
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
如果你提供更多的信息,它會更容易給你一個更好的答案。您可能希望旋轉數據(將行轉爲列)。
你基本上是「反規範化」結構,這對報告工具通常很有用。 – 2010-06-16 16:22:30
對不起,我指的是有兩張表格,客戶和地址,地址中有客戶ID。 – 2010-06-16 16:31:05
此視圖是否暗示客戶的地址位於兩個不同的表(a1和a2)中? – 2010-06-16 16:39:10
簡而言之,沒有。每次你至少要使用它的時候,都不要動態地重新創建視圖,也就是說。
但是,你可以可以做的是在你的視圖中預定義4個地址列,然後將你的一對多關係的前四個結果填充到這些列中。這不完全是你想要的動態視圖,但我認爲它也更加穩定/可用。
只是要說清楚,我指的是有一個客戶表和一個地址表,並且地址表有一個客戶ID引用(外鍵關係)的場景 – 2010-06-16 16:35:41