2012-02-09 60 views
0

以下是表結構,前6列用作組合鍵。SQL選擇帶複合鍵的所有記錄

col1 col2 col3 col4 col5 col6 col7 col8 
A1 A2 A3 A4 A5 1 xx yy 
A1 A2 A3 A4 A5 2 xxx yyy 
A1 A2 A3 A4 A5 3 a b 
A1 B2 A3 A4 A5 4 aa bb 
B1 A2 A3 A4 A5 5 aaa bbb 
B1 B2 B3 B4 B5 6 d e 
B1 B2 B3 B4 B5 7 dd ee 
B1 B3 C3 B4 B5 8 ddd eee 

我需要一個存儲過程返回象下面

A1 A2 A3 A4 A5 xx yy xxx yyy a b 
A1 B2 A3 A4 A5 aa bb 
B1 A2 A3 A4 A5 aaa bbb  
B1 B2 B3 B4 B5 d e dd ee 
B1 B2 C3 B4 B5 ddd eee 

任何指針或幫助表示讚賞的值。

+0

在您的結果中,前5個值足夠簡單。但是,每行都有不同數量的列。 SQL只是不支持。你想要「xx,yy,xxx,yyy,a,b」(例如)作爲單個字符串返回嗎?如果是這樣,爲什麼?這樣的非規範化感覺像是在方法中可能是錯誤的,如果我們知道要實現什麼,我們可能會提供一種不同的方法。 – MatBailie 2012-02-09 10:17:35

+0

感謝您的答覆。如果前五列對於行是相同的,我需要在表中顯示一行中的值。但是,列會根據前5列的重複行動態更改。我是新手SQL查詢。我不確定是否可能。 – vijay 2012-02-09 10:29:07

+1

簡短的回答是「不,你不能有動態的列數」。如果你描述你需要這個結果*,那麼我們可能會提供一個替代方案。 – MatBailie 2012-02-09 10:30:51

回答

0

如果你只需要像這樣的結果:

A1 A2 A3 A4 A5 xx,yy,xxx,yyy,a,b 
A1 B2 A3 A4 A5 aa,bb 
B1 A2 A3 A4 A5 aaa,bbb 
B1 B2 B3 B4 B5 d,e,dd,ee 
B1 B3 C3 B4 B5 ddd,eee 

然後一個簡單的查詢就可以了:

select COL1 
     ,COL2 
     ,COL3 
     ,COL4 
     ,COL5 
     ,LISTAGG(COL7 || ',' || COL8, ',') within group (order by COL6) 
    from TAB1 
group by COL1, COL2, COL3, COL4, COL5 
order by COL1, COL2, COL3, COL4, COL5 

得到你需要創建一個動態SQL列的動態數量。有關該指南,請參閱this文章。

+0

我正在sql server 2005上工作。我沒有得到什麼是LISTAGG – vijay 2012-02-09 10:55:56

+0

我的答案是針對Oracle的。我將更新問題中的標記以指示SQL-Server。看看[這個](http://www.simple-talk。com/sql/t-sql-programming/concatenating-row-values-in-transact-sql /)在連接SQL-Server中的行的方式中的文章。 – 2012-02-09 11:01:35

0

首先,作爲查詢的標準結果集,您無法返回可變數量的列,但是您可以返回列上,該列是xml列(在SQL 2005中已引入)http://msdn.microsoft.com/en-us/library/ms345117%28v=sql.90%29.aspx,然後您可以將其綁定到該列。綁定必須是動態的。您可以使用數據透視功能http://msdn.microsoft.com/en-us/library/ms177410.aspx可能有助於以所需格式顯示數據 - 或者如上所述,您可以使用動態SQL。如果你這樣做,你應該在存儲過程中生成動態SQL,並使用sp_executesql來執行你生成的字符串http://msdn.microsoft.com/en-us/library/ms175170.aspx,你可能需要傳遞參數http://support.microsoft.com/kb/262499來防止注入攻擊。不少步驟可以學習......但是每一步都不是特別困難,而且是一次很棒的練習!

+0

一個例子會很有幫助... – vijay 2012-02-09 11:44:17

+0

大多數鏈接都有示例腳本,我這樣做的方式是從基本選擇開始,證明它可行,創建一個腳本來生成select和sp_executesql它。然後一步一步修改生成腳本,保存每個版本,以便在完全搞砸時我可以回去。這是一種非常強大的學習技術,恐怕真正學習的唯一方法就是潛入並嘗試。 – 2012-02-09 14:12:17

0

檢查一下,不知道它是否對你有幫助。我使用了SQL Server 2008,它會根據您的需求返回結果。

SELECT col1, col2, col3, col4, col5, 
(SELECT ' ' + col7 + ' ' + col8 FROM TABLE1 t1 
WHERE t1.col1 = t.col1 and t1.col2 = t.col2 and 
t1.col3 = t.col3 and t1.col4 = t.col4 and t1.col5 = t.col5 
ORDER BY col6 
FOR XML PATH('')) AS mearge_col 
FROM TABLE1 t 
GROUP BY col1, col2, col3, col4, col5