2013-08-01 138 views
2

我需要一個視圖兼容的SQL查詢來完成以下結果(視圖1)。將結果拆分爲單獨的列

Table 1: 
-------------- 
ID | Folder 
-------------- 
1 | foo 
2 | bar 

Table 2: 
------------------------------------- 
ID | Table1_ID | Name | Right 
------------------------------------- 
1 | 1   | fooUser | W 
2 | 2   | barUser | R 

View 1: 
------------------------------- 
Folder | fooUser | barUser 
------------------------------- 
foo  |  W  | 
bar  |   | R 

我只能用自定義函數做到這一點,但我只能用它作爲存儲過程。我想將結果綁定到GridView。我希望有人能幫助我。

+0

如果你希望當第三行添加到表2它是動態的(和期望出現一個新列)你不會從視圖中獲取它(或者任何其他可組合成較大查詢的對象) - 視圖中的查詢只能是靜態查詢,並且任何特定的靜態查詢總會產生結果相同的「形狀」 - 固定數量的列,這些列的名稱和數據類型也是固定的。 –

+0

當然,我需要動態數據。我意識到我的嘗試是不可能的,因爲我沒有找到任何可能的解決方案。謝謝你爲我清理這個。不知道是否應該創建一個新的話題,但我會問:實體框架能爲我完成任務嗎?還是在運行時創建一個數據表最常見的解決方案? – Bonzai

回答

2

無論何時您希望將值轉換爲列,請使用PIVOT。在這裏你需要一個選擇:

SELECT Folder, [fooUser], [baruser] 
FROM (SELECT t.Folder, tt.* FROM one t JOIN two tt ON t.ID = tt.Table1_ID) AS source 
PIVOT 
(
    MAX(Rightt) 
    FOR Name IN (fooUser, barUser) 
) AS PivotTable; 

把它應用到CREATE VIEW ... AS它應該工作。

SQLFiddle

+0

感謝您的解決方案,但我忘記提及我在談論動態數據。 – Bonzai

0

只是爲了好玩,這裏是一個愚蠢的答案,但它的工作原理:)我建議使用PIVOT雖然@makciook。

select a.Folder, 
     foo.[Right] fooUser, 
     bar.[Right] barUser 
    from one a 
    left join two foo on a.ID = 1 and foo.ID = 1 
    left join two bar on a.ID = 2 and bar.ID = 2 
2

可以使用聚合函數CASE表達式從行中的數據樞轉到列:

select t1.folder, 
    max(case when t2.name = 'fooUser' then [right] else '' end) fooUser, 
    max(case when t2.name = 'barUser' then [right] else '' end) barUser 
from table1 t1 
inner join table2 t2 
    on t1.id = t2.Table1_ID 
group by t1.folder; 

參見SQL Fiddle with Demo

如果你需要一個動態的解決方案,那麼你就需要使用動態SQL:

DECLARE @cols AS NVARCHAR(MAX), 
    @query AS NVARCHAR(MAX) 

select @cols = STUFF((SELECT distinct ',' + QUOTENAME(Name) 
        from table2 
      FOR XML PATH(''), TYPE 
      ).value('.', 'NVARCHAR(MAX)') 
     ,1,1,'') 

set @query = 'SELECT folder, ' + @cols + ' 
      from 
      (
       select t1.folder, 
       t2.name, t2.[right] 
       from table1 t1 
       inner join table2 t2 
       on t1.id = t2.Table1_ID 
      ) x 
      pivot 
      (
       max([right]) 
       for name in (' + @cols + ') 
      ) p ' 

execute(@query); 

SQL Fiddle with Demo

+0

因爲我需要動態數據,所以我也無法使用您的解決方案。但我想知道你的解決方案與@makciook的解決方案之間的速度差異 – Bonzai

+0

@Bonzai看到我的編輯,我添加了一個動態SQL解決方案。 – Taryn

+0

問題是我無法使用動態SQL作爲視圖和存儲過程作爲我的控件的數據源。 – Bonzai