2015-12-15 109 views
4

因此,我構建了一個SQL視圖,以獲取更多可用於報告的可讀數據。我有一張表格,用於填寫網站上某個部分的問題的字段數據(關鍵字ID)。 Column3是一個多關鍵字字段,存儲在由chr(185)分隔的數據庫中。SQL - 從單個字段中選擇多個關鍵字值

表1

Column1 | Column2 | Column3 
     4456 | 2323 | ¹8661¹8662¹ 

我有容納關鍵字ID和它們的值的第二表。

表2

Column1 | Column2 
    4456 | val1 
    2323 | val2 
    8661 | val3 
    8662 | val4 

視圖連接表顯示關鍵字值,但我不知道如何處理多關鍵字字段(希望格式化結果如下圖所示)。

查看錶

Column1 | Column2 | Column3 
     val1 | val2 | val3; val4 

請問我需要某種形式的函數來完成這或有另一種方式?

+0

你應該知道,表1是以非常非常差的設計。這導致你目前的問題。正確的方法是在表2的表1中有一個FK,或者在兩個表之間有一個關聯表。 –

+0

不知道爲什麼你創建了這樣一個列,但我認爲你必須編寫一個函數,以分隔符分隔列,然後處理它。 –

+0

Jorge - 好吧,讓我糾正自己:表1是來自其他表的視圖在我的例子中設置如表2所示。我想要水平佈置的字段,因此每個部分有一行問題字段。最終的查看錶將在Crystal Reports中使用。 huMpty - 這個數據庫不是由我創建的,只是我正在使用的罐頭產品。 – injakari

回答

0

這裏有一個辦法做到這一點使用一些SQL Server的XML功能..sorry列名和表名做出這種難以閱讀,這裏有一個fiddle

with mapped (c1, c2, val) as ( 
    select t1.column1, t1.column2, t2.column2 
    from table1 t1 
    cross apply (select convert(xml, '<_' + replace(substring(column3,2,len(column3)-2), '¹', '/><_') + '/>')) s(c) 
    cross apply c.nodes('*') x(n) 
    join table2 t2 on t2.column1=n.value('fn:substring(local-name(.),2)', 'int')) 

select 
    column1 = c1.column2, 
    column2 = c2.column2, 
    column3 = (select val + '; ' from mapped where c1=t1.column1 and c2=t1.column2 for xml path('')) 
from table1 t1 
join table2 c1 on c1.column1=t1.column1 
join table2 c2 on c2.column1=t1.column2