【问题标题】:SQL Selecting all records with composite keySQL选择具有复合键的所有记录
【发布时间】:2012-02-09 09:50:41
【问题描述】:

这是表结构,前 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

感谢任何指针或帮助。

【问题讨论】:

  • 在您的结果中,前 5 个值很简单。但是,每行都有不同数量的列。 SQL 只是不支持。您希望“xx, yy, xxx, yyy, a, b”(例如)作为单个字符串返回吗?如果是这样,为什么?像这样的非规范化感觉方法可能有问题,如果我们知道您想要实现的目标,我们可能会提供不同的方法。
  • 感谢您的回复。如果前五列的行相同,我必须在表中的单行中显示值。是的,列将根据重复的行动态变化5 列。我是 sql 查询的新手。我不确定它是否可能。
  • 简短的回答是“不,你不能有动态的列数”。如果您描述了您需要此结果 for 的用途,那么我们或许可以提供替代方案。
  • 每个来自 SQL 的结果集都有一个特定的形状 - 它有一定数量的列,每个(命名的)列都有一个特定的数据类型。听起来您想要一个报告生成器,而不是 SQL。
  • 我需要在上面的 winform 中的网格上显示结果。

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


【解决方案1】:

如果你只需要这样的结果:

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 文章。

【讨论】:

  • 我正在使用 sql server 2005。我没有得到什么是 LISTAGG
  • 我的答案是甲骨文。我将更新您问题中的标签以指示 SQL-Server。查看this 文章,了解在 SQL-Server 中连接行的方法。
【解决方案2】:

首先,作为查询的标准结果集,您不能返回可变数量的列,但是您可以返回作为 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 以防止注入攻击。有不少步骤要学习...但是每个步骤都不是特别困难,而且是一个很好的练习!

【讨论】:

  • 好吧,大多数链接都有示例脚本,我这样做的方式是从基本选择开始,证明可行,创建一个脚本来生成该选择并使用 sp_executesql 它。然后一步一步修改生成脚本,保存每个版本,这样我完全搞砸了就可以回去了。这是一种非常强大的学习技术,恐怕真正学习的唯一方法就是潜入并尝试一下。
【解决方案3】:

检查一下,不知道它对你有没有帮助。我使用的是 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-08-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多