SQL使用复合键选择所有记录

SQL使用复合键选择所有记录,sql,sql-server,sql-server-2005,stored-procedures,dynamic,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 B

下面是表结构,前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  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。有关这方面的指南,请参阅文章。

首先,作为查询的标准结果集,您不能返回可变数量的列,但可以返回SQL 2005中引入的xml列,然后可以绑定到该列。绑定必须是动态的。您可以使用pivot函数以您想要的格式显示数据,或者如上所述,您可以使用动态SQL。如果这样做,您应该在存储过程中生成动态SQL,并使用sp_executesql执行生成的字符串,您可能需要传递参数以防止注入攻击。要学习的步骤很多。。。然而,每一步都不是特别困难,这是一个很好的练习

检查这个,不知道它是否对你有帮助。我使用了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

在结果中,前5个值足够简单。但是每行的列数不同。SQL就是不支持这一点。例如,是否希望将xx、yy、xxx、yyy、a、b作为单个字符串返回?如果是,为什么?这样的非规范化让人感觉方法可能有问题,如果我们知道您想要实现什么,我们可能可以提供不同的方法。感谢您的回复。如果前五列的行相同,我必须在表中的一行中显示值。是的,列将根据前5列的重复行动态更改。我不熟悉sql查询。我不确定这是否可能。简短的回答是否,不能有动态的列数。如果您描述了这个结果的用途,那么我们可以提供一个替代方案。SQL中的每个结果集都有一个特定的形状-它有一定数量的列,每个命名列都有一个特定的数据类型。听起来你想要的是一个报表生成器,而不是SQL。我需要如上所述在winform中的网格上显示结果。我正在使用SQL server 2005。我没有得到什么结果。我的答案是针对Oracle的。我将更新您问题中的标记以指示SQL Server。请看一篇关于在SQL-Server中连接行的方法的文章。大多数链接都有示例脚本,我这样做的方式是从一个基本的select开始,证明它是有效的,创建一个脚本来生成该select并执行SQL。然后一步一步地修改生成脚本,保存每个版本,以便在我完全搞砸的时候返回。这是一个非常强大的学习技巧,我担心真正学习的唯一方法就是潜入并尝试它。
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