SQL选择具有组合键的所有记录

时间:2012-02-09 09:50:42

标签: sql sql-server sql-server-2005 stored-procedures dynamic

这是表结构,前6列为复合键。

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

感谢任何指示或帮助。

3 个答案:

答案 0 :(得分: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文章。

答案 1 :(得分:0)

首先,作为查询的标准结果集,您无法返回可变数量的列,但是您可以返回列,该列是xml列(在SQL 2005中引入)http://msdn.microsoft.com/en-us/library/ms345117%28v=sql.90%29.aspx,然后您可以将其绑定到。绑定必须是动态的。您可以使用pivot函数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以防止注入攻击。学习相当多的步骤...但是每一步都不是特别困难,而且是一项很好的练习!

答案 2 :(得分: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