[加分了!] 请教一个SQL行转列及动态字段的问题,谢谢。

[大楚] 2019-08-11 11:52:43

--建表
create table Family
(
FID int primary key,
ParentName varchar(20),
Addr varchar(50)
)



create table Children
(
CID int identity(1,1) primary key,
FID int,
ChildName varchar(20),
Age int,
)


--测试数据
insert into Family (FID, ParentName,Addr) values (1, '张三', '中华大街');
insert into Family (FID, ParentName,Addr) values (2, '李四', '云海南路');
insert into Family (FID, ParentName,Addr) values (3, '王五', '和平小巷');


insert into Children (FID, ChildName,Age) values (1, '张小', 10);

insert into Children (FID, ChildName,Age) values (2, '李一', 8);
insert into Children (FID, ChildName,Age) values (2, '李二', 12);

insert into Children (FID, ChildName,Age) values (3, '王龙', 13);
insert into Children (FID, ChildName,Age) values (3, '王虎', 10);
insert into Children (FID, ChildName,Age) values (3, '王凤', 7);




查询语句:
select a.FID, ParentName, Addr, ChildName, Age from Family a, Children b where a.FID = b.FID and a.FID <= 3

查询结果
FID ParentName Addr ChildName Age
1 张三 中华大街 张小 10
2 李四 云海南路 李一 8
2 李四 云海南路 李二 12
3 王五 和平小巷 王龙 13
3 王五 和平小巷 王虎 10
3 王五 和平小巷 王凤 7



希望得到这样的查询结果:
FID ParentName Addr ChildName Age ChildName Age ChildName Age
1 张三 中华大街 张小 10
2 李四 云海南路 李一 8 李二 12
3 王五 和平小巷 王龙 13 王虎 10 王凤 7


当 a.FID <= 2 时, ChildName和Age列重复两次, 字段不足的记录空白。
实际上的要求是:动态列的增加是根据 Children 表中相同 FID 记录的最大数量来增加的,
而 Children 表中相同 FID 值的记录数量是不固定的

在Winform中应用,也可以考虑使用DataTable等相关组件,要求查询效率高,谢谢!








...全文
2248 40 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
40 条回复
切换为时间正序
请发表友善的回复…
发表回复
qq_41920854 2019-08-16
  • 打赏
  • 举报
回复
group by前面两个字段,最后一个字段用拼接函数
XBodhi. 2019-08-15
  • 打赏
  • 举报
回复
引用 9 楼 秋的红果实 的回复:
再改下,否则没有年龄。一天的精力耗尽了,呵呵 while(read.Read()) { if(!read[0].Equals(null)&&!read[1].Equals(null)) 就是拼字符串 分别读取,ADO.NET的reed,效率还是不错的 不要执行sql join,笛卡尔运算,肯定慢
datareader 速度是块,但是你要考虑每次去读取 数据库的损耗。虽说有连接池。但是 tcp 过去还是有损耗的。
[大楚] 2019-08-15
  • 打赏
  • 举报
回复
感谢各位的回复,准备结帖了。
[大楚] 2019-08-15
  • 打赏
  • 举报
回复
如果单纯字符串拼接的话,不如使用 for xml path方便。 select FID, ParentName, Addr, (select ChildName + ',' + cast(Age as varchar(2)) + ',' from Children a where a.fid = b.fid for xml path('')) as Child from Family b group by FID, ParentName, Addr
XBodhi. 2019-08-14
  • 打赏
  • 举报
回复
这个有有什么关系吗,游标配 表值函数 或是存储过程加临时表,什么结果都直接输出并绑定到UI。
SinGooCMS 2019-08-14
  • 打赏
  • 举报
回复
先不说其它的,你的表设计就不对!
XBodhi. 2019-08-14
  • 打赏
  • 举报
回复
可以结帖了 楼主
weixin_45524920 2019-08-14
  • 打赏
  • 举报
回复
相同问题,支持一下
[大楚] 2019-08-14
  • 打赏
  • 举报
回复
引用 36 楼 XBodhi. 的回复:
游标可以的,速度也还可以了现在,比你 C# 来搞好很多,而且,我写的那个 基本上满足你的要求,你可以多弄点数据看看。 如果长度超出了,你可以换个类型,毕竟 VARCHAR 只能 8000
首先谢谢了,不是你的效率低。 真实项目需求是房地产销售,子表字段包括房屋的面积、单价、金额等有逻辑关系的字段,前端需要通过grid来显示,并且能够导出EXCEL,不是说你的效率低了,而是数据要配合前端使用,光显示一个字符串是无法满足需求的,前端再拆分一次,一样的道理。 所以DataTable只是做为grid 的数据源来处理的。
XBodhi. 2019-08-14
  • 打赏
  • 举报
回复
游标可以的,速度也还可以了现在,比你 C# 来搞好很多,而且,我写的那个 基本上满足你的要求,你可以多弄点数据看看。 如果长度超出了,你可以换个类型,毕竟 VARCHAR 只能 8000
weixin_37798730 2019-08-14
  • 打赏
  • 举报
回复
支持一下 ,过几年我研究研究
[大楚] 2019-08-14
  • 打赏
  • 举报
回复
引用 27 楼 XBodhi. 的回复:
我手写的。
谢谢了,不管数据库,还是winform, 大家思路都差不多, 这个问题其实要求的是动态字段,是数据字段的拼接,而不是字符串拼接, 主要是怕拼接过程影响效率。 还有个问题是,有没有什么好的办法找出同一ID,最大的记录数量, 就是不知道字段要添加几次,不同条件的查询,有可能有1条子记录,也可能3条子记录。
[大楚] 2019-08-14
  • 打赏
  • 举报
回复
引用 17 楼 ManBOyyy 的回复:
[quote=引用 16 楼 [大楚] 的回复:] For XML Path('') 还是对字段值输出格式化 最终我想获取一个DataTable,问题还是如何在DataTable中动态添加字段, DataTable.Merge() 有动态创建字段的功能,只不过调用次数太多,影响效率了。
你就吹吧,我調用創建三百多個列也沒問題,估計是你邏輯有問題,邏輯有問題,肯定影響效率[/quote] 今天做了一下测试,效率确实没有问题,即使DataGridView动态添加字段的情况下,1千条记录不至2秒钟, 实际项目中代码太多,懒得测试了。
[大楚] 2019-08-14
  • 打赏
  • 举报
回复
引用 31 楼 SinGooCMS 的回复:
先不说其它的,你的表设计就不对!
还真没有特别注意表的问题,指教一下。
ManBOyyy 2019-08-13
  • 打赏
  • 举报
回复
引用 22 楼 [大楚
的回复:] [quote=引用 17 楼 ManBOyyy 的回复:] [quote=引用 16 楼 [大楚] 的回复:] For XML Path('') 还是对字段值输出格式化 最终我想获取一个DataTable,问题还是如何在DataTable中动态添加字段, DataTable.Merge() 有动态创建字段的功能,只不过调用次数太多,影响效率了。
你就吹吧,我調用創建三百多個列也沒問題,估計是你邏輯有問題,邏輯有問題,肯定影響效率[/quote] 实际功能执行效率确实不高,因为界面是用DataGridView来显示,DataGridView的列也是动态创建的,具体是代码,还是逻辑,还是其它方面影响的效率,我也没有确认,有时间我做个测试,再和你沟通。 [/quote] DataGridView的列也是动态创建???DataGridView直接綁定datatable不可以?除了樣式美觀這幾個方面,列和數據還是直接綁定datatable比較好
[大楚] 2019-08-13
  • 打赏
  • 举报
回复
引用 17 楼 ManBOyyy 的回复:
[quote=引用 16 楼 [大楚] 的回复:] For XML Path('') 还是对字段值输出格式化 最终我想获取一个DataTable,问题还是如何在DataTable中动态添加字段, DataTable.Merge() 有动态创建字段的功能,只不过调用次数太多,影响效率了。
你就吹吧,我調用創建三百多個列也沒問題,估計是你邏輯有問題,邏輯有問題,肯定影響效率[/quote] 实际功能执行效率确实不高,因为界面是用DataGridView来显示,DataGridView的列也是动态创建的,具体是代码,还是逻辑,还是其它方面影响的效率,我也没有确认,有时间我做个测试,再和你沟通。
weixin_41805876 2019-08-13
  • 打赏
  • 举报
回复
学习了,正常学这块内容。
郝你个建强 2019-08-13
  • 打赏
  • 举报
回复
玩论坛的大多是10year左右的账号,大佬们以前都是玩论坛的
匹诺丶老曹 2019-08-13
  • 打赏
  • 举报
回复
up up up
ManBOyyy 2019-08-13
  • 打赏
  • 举报
回复
引用 17 楼 ManBOyyy 的回复:
[quote=引用 16 楼 [大楚] 的回复:]
For XML Path('') 还是对字段值输出格式化

最终我想获取一个DataTable,问题还是如何在DataTable中动态添加字段

DataTable.Merge() 有动态创建字段的功能,只不过调用次数太多,影响效率了。

你就吹吧,我調用創建三百多個列也沒問題,估計是你邏輯有問題,邏輯有問題,肯定影響效率[/quote]
都不用一秒創建幾百列
加载更多回复(20)

111,094

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧