多表查询 一对多拼接查询 好的分全给你

qq_35062751 2018-08-13 03:43:57
我有两张表,表A表B
表A数据
id name
1 a
2 b
3 c
表B数据
id pid psd www
1 1 a 1111
2 1 b 22222
3 2 c 33333
4 3 d 444444
5 3 e 55555

现在我想求出这样的结果 拼接也行
id=1 id name psd www
1 a a,b 11111,22222
2 b c 33333
3 c d,e 44444,555555

...全文
399 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
qq_35062751 2018-09-28
  • 打赏
  • 举报
回复
其实是我错了 这是用php语言拼接成功
吉普赛的歌 2018-08-14
  • 打赏
  • 举报
回复
引用 6 楼 qq_35062751 的回复:
我发在4楼的数据 因为要前台可以调出psd字段下面111和222d 的数据 而你们做的都是用`,`拼接 获取不了单个的数据


前端 ( html, winform 等 ) <=>后端( c#, java 等 ) <=> 数据库 。
每个环节的分工是不一样的, 数据库是专门提供数据处理功能的地方, 不是组织数据的地方。
这些放到程序里去处理吧。

处理 json (何况你这个还得自己定义格式)数据库勉为其难,程序里轻松灵活。

程序里定义一个对应的 class , new 一个对象, 往里面赋值, 再序列化为 json 就可以了。
qq_35062751 2018-08-14
  • 打赏
  • 举报
回复
引用 5 楼 yenange 的回复:
借 #1 版主数据.
如果你用的是 SQL Server 2016 或 2017, 可以如下面的代码:
但如果只有低版本的SQL Server,你又想得到 json, 最好是程序处理。
一定要用 SQL Server 的话, 只能写 sqlclr 存储过程或函数来实现了。

if not object_id(N'Tempdb..#A') is null
drop table #A
Go
Create table #A([id] int,[name] nvarchar(21))
Insert #A
select 1,N'a' union all
select 2,N'b' union all
select 3,N'c'
GO
if not object_id(N'Tempdb..#B') is null
drop table #B
Go
Create table #B([id] int,[pid] int,[psd] nvarchar(21),[www] NVARCHAR(100))
Insert #B
select 1,1,N'a',1111 union all
select 2,1,N'b',22222 union all
select 3,2,N'c',33333 union all
select 4,3,N'd',444444 union all
select 5,3,N'e',55555
GO

SELECT a.id,
a.name,
string_agg(psd, ',') AS psd,
string_agg(www, ',') AS www
FROM #A AS a
INNER JOIN #B AS b
ON a.id = b.pid
GROUP BY
a.id,
a.name
FOR JSON AUTO;
/*
[{"id":1,"name":"a","psd":"a,b","www":"1111,22222"},{"id":2,"name":"b","psd":"c","www":"33333"},{"id":3,"name":"c","psd":"d,e","www":"444444,55555"}]
*/


我发在4楼的数据 因为要前台可以调出psd字段下面111和222d 的数据 而你们做的都是用`,`拼接 获取不了单个的数据
qq_35062751 2018-08-14
  • 打赏
  • 举报
回复
引用 7 楼 yenange 的回复:
[quote=引用 6 楼 qq_35062751 的回复:]

处理 json (何况你这个还得自己定义格式)数据库勉为其难,程序里轻松灵活。

程序里定义一个对应的 class , new 一个对象, 往里面赋值, 再序列化为 json 就可以了。


我在4楼发的不是json啊 $sql = "select * from A where ID = 1"
var_dump($sql);
我想要输出的结果就是我在4楼发出的那种格式
var_dump($sql['psd']['111']); 能获取到我要求的值
吉普赛的歌 2018-08-13
  • 打赏
  • 举报
回复
借 #1 版主数据.
如果你用的是 SQL Server 2016 或 2017, 可以如下面的代码:
但如果只有低版本的SQL Server,你又想得到 json, 最好是程序处理。
一定要用 SQL Server 的话, 只能写 sqlclr 存储过程或函数来实现了。

if not object_id(N'Tempdb..#A') is null
drop table #A
Go
Create table #A([id] int,[name] nvarchar(21))
Insert #A
select 1,N'a' union all
select 2,N'b' union all
select 3,N'c'
GO
if not object_id(N'Tempdb..#B') is null
drop table #B
Go
Create table #B([id] int,[pid] int,[psd] nvarchar(21),[www] NVARCHAR(100))
Insert #B
select 1,1,N'a',1111 union all
select 2,1,N'b',22222 union all
select 3,2,N'c',33333 union all
select 4,3,N'd',444444 union all
select 5,3,N'e',55555
GO

SELECT a.id,
a.name,
string_agg(psd, ',') AS psd,
string_agg(www, ',') AS www
FROM #A AS a
INNER JOIN #B AS b
ON a.id = b.pid
GROUP BY
a.id,
a.name
FOR JSON AUTO;
/*
[{"id":1,"name":"a","psd":"a,b","www":"1111,22222"},{"id":2,"name":"b","psd":"c","www":"33333"},{"id":3,"name":"c","psd":"d,e","www":"444444,55555"}]
*/
qq_35062751 2018-08-13
  • 打赏
  • 举报
回复
array(2) {
[0]=>
array(10) {
["id"]=> "1"
["name"]=> "a"
["psd"]=> {
["111"]=>"a"
["222"]=>"b"
}
["www"]=> {
["111"]=>"11111"
["222"]=>"22222"
}
}
[1]=>
array(10) {
["id"]=> "1"
["agentName"]=> "b"
["psd"]=> {
["111"]=>"c"
}
["www"]=> {
["111"]=>"33333"
}
}
[2]=>
array(10) {
["id"]=> "1"
["agentName"]=> "c"
["psd"]=> {
["111"]=>"d"
["222"]=>"e"
}
["www"]=> {
["111"]=>"44444"
["222"]=>"55555"
}
}
}这样的结果 其实和json差不多 就是查询出来的结果var_dump出来后的格式
二月十六 2018-08-13
  • 打赏
  • 举报
回复
json格式在程序里边处理,不在数据库查询处处理
qq_35062751 2018-08-13
  • 打赏
  • 举报
回复
{
"id": "1",
"name": "有限公司",
"psd": {
"111":"a",
"222":"b"
},
"www": {
"111":11111,
"222":22222,
},
}
{
"id": "1",
"name": "有限公司",
"psd": {
"111":"c"
},
"www": {
"111":333333
},
}
{
"id": "1",
"name": "有限公司",
"psd": {
"111":"d",
"222":"e"
},
"www": {
"111":44444,
"222":55555,
},
},

我想要返回的是这样的json格式 就是说能查询出所有的数据 可以单独提出www的数据
二月十六 2018-08-13
  • 打赏
  • 举报
回复
--测试数据
if not object_id(N'Tempdb..#A') is null
drop table #A
Go
Create table #A([id] int,[name] nvarchar(21))
Insert #A
select 1,N'a' union all
select 2,N'b' union all
select 3,N'c'
GO
if not object_id(N'Tempdb..#B') is null
drop table #B
Go
Create table #B([id] int,[pid] int,[psd] nvarchar(21),[www] NVARCHAR(100))
Insert #B
select 1,1,N'a',1111 union all
select 2,1,N'b',22222 union all
select 3,2,N'c',33333 union all
select 4,3,N'd',444444 union all
select 5,3,N'e',55555
Go
--测试数据结束
SELECT id,a.name ,
STUFF(( SELECT ',' + psd
FROM #B
WHERE pid = a.id
FOR
XML PATH('')
), 1, 1, '') AS psd,
STUFF(( SELECT ',' + www
FROM #B
WHERE pid = a.id
FOR
XML PATH('')
), 1, 1, '') AS www
FROM #A a
GROUP BY a.id,a.name


22,209

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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