求一个SQL,

小小小的程序员 2018-09-12 04:21:39

如上图示例,一对多关系,在列表页里展示出主表的同时把副表内容带出来

要求是,要按照主表来分页,如每页20条主表记录,把这20条记录对应的副表记录也取出来。
分页的语句就不用写了,主要是怎么把副表的带出来,普通left join查出来是分不了页的
...全文
320 9 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
吉普赛的歌 版主 2018-09-13
  • 打赏
  • 举报
回复
最后语句加一个排序:
ORDER BY t.rid,t.rid2
吉普赛的歌 版主 2018-09-13
  • 打赏
  • 举报
回复
use tempdb
go
IF Object_ID('mainT') is not null drop table mainT
IF Object_ID('subT') is not null drop table subT
go
CREATE TABLE mainT(
id INT IDENTITY(1,1) PRIMARY KEY,
n NVARCHAR(10)
)
GO
CREATE TABLE subT(
subId INT IDENTITY(1,1) PRIMARY KEY,
id INT,
subN NVARCHAR(10)
)
GO
INSERT INTO mainT(n) VALUES('a'),('b'),('c'),('d'),('e')
INSERT INTO subT(id,subN) VALUES(1,'aa'),(1,'bb'),(2,'cc'),(2,'dd'),(3,'ee'),(3,'ff'),(3,'gg'),(4,'gg'),(4,'hh'),(5,'ii')
GO
DECLARE @pageIndex INT,@pageSize INT
SET @pageIndex=2
SET @pageSize=2

;WITH cte AS (
SELECT ROW_NUMBER() OVER (ORDER BY id) AS rid,* FROM mainT
),cte2 AS (
SELECT ROW_NUMBER() OVER (PARTITION BY a.rid ORDER BY b.subN) AS rid2,a.*,b.subId,b.subN
FROM cte AS a LEFT JOIN subT AS b
ON a.id=b.id
WHERE a.rid > (@pageIndex-1)*@pageSize AND a.rid<=@pageIndex*@pageSize
)
SELECT
t.id
,CASE WHEN rid2=1 THEN LTRIM(t.n) ELSE '' END AS n
,t.subId
,t.subN
FROM cte2 AS t



类似这样处理就可以了。
二月十六 版主 2018-09-13
  • 打赏
  • 举报
回复
引用 6 楼 fanjian1314 的回复:
[quote=引用 5 楼 sinat_28984567 的回复:]
[quote=引用 3 楼 fanjian1314 的回复:]
[quote=引用 1 楼 sinat_28984567 的回复:]
程序里边读取两遍,第一次按照分页把主表信息读取出来,第二次把第一次读取的主表id穿进去,读取明细表信息

有没有办法一条SQL搞定?[/quote]
可以用存储过程
分页读取主表信息存到临时表,然后读取临时表关联明细表数据。[/quote]
这样在存储过程里也是要执行多次查询,我是想一次性查询[/quote]
你现在的分页怎么实现的?
  • 打赏
  • 举报
回复
引用 5 楼 sinat_28984567 的回复:
[quote=引用 3 楼 fanjian1314 的回复:] [quote=引用 1 楼 sinat_28984567 的回复:] 程序里边读取两遍,第一次按照分页把主表信息读取出来,第二次把第一次读取的主表id穿进去,读取明细表信息
有没有办法一条SQL搞定?[/quote] 可以用存储过程 分页读取主表信息存到临时表,然后读取临时表关联明细表数据。[/quote] 这样在存储过程里也是要执行多次查询,我是想一次性查询
二月十六 版主 2018-09-12
  • 打赏
  • 举报
回复
引用 3 楼 fanjian1314 的回复:
[quote=引用 1 楼 sinat_28984567 的回复:]
程序里边读取两遍,第一次按照分页把主表信息读取出来,第二次把第一次读取的主表id穿进去,读取明细表信息

有没有办法一条SQL搞定?[/quote]
可以用存储过程
分页读取主表信息存到临时表,然后读取临时表关联明细表数据。
  • 打赏
  • 举报
回复
引用 2 楼 yenange 的回复:
最简单的是分两步, 第一步, 分页只查主表, 不查副表; 第二表, 查完主表后, 在构建每条数据时, 把副表的相关记录查一次。 C# 设计类 结构类似下面:
public class ORDER{
    public string OrderNO{ get;set; }  //单号
    public List<Detail> DetailList { get;set; }
}

public class Detail {
    public string ProductName { get;set; } //品名
    public string Format { get;set; }          //规格
}
我现在是这么做的,但是这样性能不好,想一条SQL搞定
  • 打赏
  • 举报
回复
引用 1 楼 sinat_28984567 的回复:
程序里边读取两遍,第一次按照分页把主表信息读取出来,第二次把第一次读取的主表id穿进去,读取明细表信息
有没有办法一条SQL搞定?
二月十六 版主 2018-09-12
  • 打赏
  • 举报
回复
程序里边读取两遍,第一次按照分页把主表信息读取出来,第二次把第一次读取的主表id穿进去,读取明细表信息
吉普赛的歌 版主 2018-09-12
  • 打赏
  • 举报
回复
最简单的是分两步,
第一步, 分页只查主表, 不查副表;
第二表, 查完主表后, 在构建每条数据时, 把副表的相关记录查一次。

C# 设计类 结构类似下面:
public class ORDER{
public string OrderNO{ get;set; } //单号
public List<Detail> DetailList { get;set; }
}

public class Detail {
public string ProductName { get;set; } //品名
public string Format { get;set; } //规格
}

34,838

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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