两表关联,A表主表B表附表,如何让附表数据横排显示?

JzKx 2019-03-19 09:36:38
A表 ID 名称
B表 ID PID 类型 数量

目前我知道的方法是 多个SELECT查询

SELECT 名称,(SELECT 数量 FROM B WHERE PID=A.ID AND 类型=1) AS B1数量,(SELECT 数量 FROM B WHERE PID=A.ID AND 类型=2) AS B2数量 FROM A


我想知道有没有其他的查询方法效能高点的?
...全文
302 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
leo_lesley 2019-03-19
  • 打赏
  • 举报
回复


create table A ( ID int , name varchar(10))
go
create table B ( ID int , PID int , type int , qty int)
go


insert A
select 1 , '数学'
union select 2 ,'语文'

go

insert B
select 1 , 1 , 1 , 80
union select 2 , 2 , 2 , 98
union select 3 , 1 , 2 , 97


select name , max([1]) , max([2]) from (select a.name , b.* from A left join B on A.ID = B.PID ) a pivot(max(qty) for type in([1],[2])) c
group by name

go
drop table A , B


leo_lesley 2019-03-19
  • 打赏
  • 举报
回复
行列转换用pivot,08以上都支持的
JzKx 2019-03-19
  • 打赏
  • 举报
回复

SELECT 名称,CASE WHEN 类型=1 THEN 数量 ELSE 0 END AS B1数量,
CASE WHEN 类型=2 THEN 数量 ELSE 0 END AS B2数量
FROM A
JOIN B ON A.ID=B.PID


这样 会出现多条重复记录 B表的数据是多条竖列的
RINK_1 2019-03-19
  • 打赏
  • 举报
回复

SELECT 名称,CASE WHEN 类型=1 THEN 数量 ELSE 0 END AS B1数量,
CASE WHEN 类型=2 THEN 数量 ELSE 0 END AS B2数量
FROM A
JOIN B ON A.ID=B.PID

JzKx 2019-03-19
  • 打赏
  • 举报
回复
OUTER APPLY 的效率 比直接 SELECT子查询的效率高么?
RINK_1 2019-03-19
  • 打赏
  • 举报
回复
引用 2 楼 JzKx 的回复:
SELECT 名称,CASE WHEN 类型=1 THEN 数量 ELSE 0 END AS B1数量, CASE WHEN 类型=2 THEN 数量 ELSE 0 END AS B2数量 FROM A JOIN B ON A.ID=B.PID 这样 会出现多条重复记录 B表的数据是多条竖列的
再试试以下的

SELECT A.名称,B.数量 AS B1数量,
C.数量 AS B2数量
FROM A
OUTER APPLY (SELECT TOP 1 * FROM B WHERE A.ID=PID AND 类型=1) AS B
OUTER APPLY (SELECT TOP 1 * FROM B WHERE A.ID=PID AND 类型=2) AS C

22,209

社区成员

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

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