Sha*_*hin 5 sql t-sql sql-server
我有三张桌子:
例如,这里有关于数据库的数据:
是否可以编写提供如下结构的网格的查询?
使用简单连接编写查询,结果如下:
SELECT dbo.Contact.ContactID, dbo.Contact.ContactName, dbo.PhoneNumber.PhoneNO, dbo.PhoneType.TypeTitle
FROM dbo.Contact INNER JOIN
dbo.PhoneNumber ON dbo.Contact.ContactID = dbo.PhoneNumber.ContactID AND dbo.Contact.ContactID = dbo.PhoneNumber.ContactID INNER JOIN
dbo.PhoneType ON dbo.PhoneNumber.PhoneType = dbo.PhoneType.PhoneTypeI
Run Code Online (Sandbox Code Playgroud)

您正在寻找的是字符串聚合.T-SQL原生不这样做(其他dbs例如有string_agg).但你可以模拟它.
试着寻找例子:http: //consultingblogs.emc.com/jamiethomson/archive/2009/07/16/string-aggregation-in-t-sql-amp-pl-sql.aspx
或者,对于completists:
http://www.postgresonline.com/journal/archives/191-stringagg.html
如果您SQL Server在最后一个链接中搜索,有三种不同的方法可以执行此操作.
感谢您确认这将被 .NET 使用。
我问的原因是我认为数据库不是转换数据的最佳场所。并不是说你永远不应该,只是说最好使用数据库来发挥它的优势:存储和检索数据,并在使用代码中进行转换。这是一个尽可能遵循的一般原则 - 它使您的数据保持更“原始”的格式,因此更有可能在以后被其他进程重用和使用。
本质上,我将问题解释为您想要:
我不确定调用数据库的 .NET 代码是什么样的,但您可以使用以下DataTable示例执行以下操作(假设您有类似Contact类型的东西):
List<Contact> results = (
from dataRow in myDataTable.AsEnumerable()
let contactData = new {
ContactName = dataRow.Field<string>("ContactName"),
PhoneType = dataRow.Field<string>("PhoneType"),
PhoneNumber = dataRow.Field<string>("PhoneNO")
}
group contactData by new { contactData.ContactName, contactData.PhoneType } into grp
select new Contact {
ContactName = grp.Key.ContactName,
PhoneType = grp.Key.PhoneType,
PhoneNumber = grp.Aggregate( (cumulativeText, contact) => String.Format("{0}, {1}", cumulativeText, contact.PhoneNumber) )
}
).ToList();
Run Code Online (Sandbox Code Playgroud)
我没有 IDE 来测试,所以把它当作粗略的代码。不过你可以从中得到原理。