【问题标题】:Appending data in T-SQL在 T-SQL 中附加数据
【发布时间】:2014-12-18 09:56:43
【问题描述】:

我有一个 sql (transact sql - SQL server 2012),用于从具有有效地址(来自表详细信息)的表(客户)中获取客户的姓名:

Select Customer.Name, Details.Address 
from Customer 
left outer join Details on Details.Customer = Customer.Name

这用于每次从数据库服务器发回每个客户的每个记录(名称)行。不会提取多条记录。

最近我需要修改这个 sql 文本,以便根据数据库获取他们借阅的书籍的名称,该数据库保存在另一个表(Lending)中。现在脚本看起来像:

Select Customer.Name, Details.Address, Lending.BookName 
from Customer 
left outer join Details on Details.Customer = Customer.Name 
left outer join Lending on Lending.CustomerName = Customer.Name

它正在正确返回记录,但现在我遇到了问题。由于一个客户可以借多本书,因此返回的数据有多行显示同一客户的多个书名。根据我的软件规范,我需要为每个客户获取一行,并且在那一行中,我需要将所有书名附加到一列中。 有人可以帮我解决这个问题:如何在单个列中为同一记录附加多个数据,例如:

Name    Address    BookName
Somdip  XX         Brief History of Time,Headfirst SQL,Headfirst C#

而不是

Name    Address    BookName
Somdip  XX         Brief History of Time
Somdip  XX         Headfirst SQL
Somdip  XX         Headfirst C#

??

【问题讨论】:

标签: c# sql .net sql-server-2012


【解决方案1】:

我在上面的 sql 文本中使用了 'where' 和 'order by' 子句,例如:

SELECT Name,
       Address    ,
       Split.a.value('.', 'VARCHAR(100)') BookName
FROM   (SELECT Name,
               Address    ,
               Cast ('<M>' + Replace(BookName, ',', '</M><M>') + '</M>' AS XML) AS Data
        FROM   [table] where ID = '1' order by Name) AS A
       CROSS APPLY Data.nodes ('/M') AS Split(a)

它给了我一个错误:ORDER BY 子句在视图、内联函数、派生表、子查询和公用表表达式中无效,除非还指定了 TOP、OFFSET 或 FOR XML。

【讨论】:

  • 我现在将 order by 子句放在 Split(a) 之后,它正在工作,但它正在生成另一个错误:XML 解析:第 1 行,字符 23,非法名称字符
【解决方案2】:

试试这个:

SELECT Name,
       Address    ,
       Split.a.value('.', 'VARCHAR(100)') BookName
FROM   (SELECT Name,
               Address    ,
               Cast ('<M>' + Replace(BookName, ',', '</M><M>') + '</M>' AS XML) AS Data
        FROM   [table]) AS A
       CROSS APPLY Data.nodes ('/M') AS Split(a) 

【讨论】:

  • 我通过 C# 编程从服务器获取数据集中的值。但是上面的代码是针对xml的……不是吗??!!对不起,我不太擅长 sql ....
  • @SomdipDey 这是用于 SQL SERVER 的
  • @SomdipDey 在 C# 中你可以拆分字符串,你会得到想要的操作
  • 嗯。还有一件事,姓名、地址和书名来自不同的表格……那么如何处理呢?我怎样才能修改上面的sql来做到这一点......?
  • @SomdipDey 是的,您可以使用派生表或 CTE [table] 将是您的派生表/CTE
【解决方案3】:

虽然我认为这通常是个坏主意 - 在单个单元格中返回多个数据项 - 但有多种方法可以解决,但性能问题不同。

你要找的东西在这里:Concatenate many rows into a single text string?

【讨论】:

    猜你喜欢
    • 2018-05-16
    • 1970-01-01
    • 1970-01-01
    • 2012-05-16
    • 2011-11-06
    • 2019-07-28
    • 1970-01-01
    • 2010-10-02
    • 1970-01-01
    相关资源
    最近更新 更多