SQL Server 多表关联查询并分页
一、多表关联查询
1.left join
RelaTimeLog表 和 ValidFlight表关联查询
select t.FlightId,t.Calsign,t.DepAddrName,t.ArrAddrName,t.Etd FROM [CDM].[dbo].[ValidFlight] t left join [CDM].[dbo].[RelaTimeLog] f on t.FlightId = f.FlightId where f.[Type] = 5 order by t.FlightId desc
2.与group by连用
select t.FlightId,t.Calsign,t.DepAddrName,t.ArrAddrName,t.Etd FROM [CDM].[dbo].[ValidFlight] t where FlightId in (select FlightId from [CDM].[dbo].[RelaTimeLog] where [Type] =5 group by FlightId) order by t.FlightId desc
二、分页
1.查询0到10条
select t.FlightId,t.Calsign,t.DepAddrName,t.ArrAddrName,t.Etd from (select *,ROW_NUMBER() over (order by FlightId Desc) as rowNumber FROM [CDM].[dbo].[ValidFlight]
where FlightId in (select FlightId from [CDM].[dbo].[RelaTimeLog] where [Type] =5 group by FlightId))t where rowNumber between 0 and 10 order by t.Etd desc
2.临时表
select t.FlightId,t.Calsign,t.DepAddrName,t.ArrAddrName,t.Etd,ROW_NUMBER() over (order by FlightId Desc) as rowNumber into #a FROM [CDM].[dbo].[ValidFlight] t where FlightId in (select FlightId from [CDM].[dbo].[RelaTimeLog] where [Type] =5 group by FlightId) order by t.FlightId desc
select * from #a where rowNumber between 0 and 10
select COUNT(*) as totalCount from #a
drop Table #a
3.分页存储过程
USE [CDM]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROC [dbo].[p_GetModifyTOBTFlight]
@PageIndex int,
@PageSize int,
@calsign nvarchar(50),
@Recount int output
AS
BEGIN
if @calsign<>''
BEGIN
select CONVERT(int,t.FlightId) as FlightId,t.Calsign,t.DepAddrName,t.ArrAddrName,t.Etd, ROW_NUMBER() over (order by Etd Desc) as rowNumber into #a FROM [CDM].[dbo].[ValidFlight] t
where FlightId in (select FlightId from [CDM].[dbo].[RelaTimeLog] where [Type] =5 and Calsign like '%'+@calsign+'%' group by FlightId)
select * from #a where rowNumber between @PageSize*((@PageIndex)-1) and @PageSize*@PageIndex
set @Recount = (select COUNT(*) from #a)
drop Table #a
END
else
BEGINselect CONVERT(int,t.FlightId) as FlightId,t.Calsign,t.DepAddrName,t.ArrAddrName,t.Etd,t.Atd,t.Ata, t.Eta,ROW_NUMBER() over (order by etd Desc) as rowNumber into #b FROM [CDM].[dbo].[ValidFlight] t
where FlightId in (select FlightId from [CDM].[dbo].[RelaTimeLog] where [Type] =5 group by FlightId)if@pageIndex >1 begin
select * from #b where rowNumber between (@PageSize*((@PageIndex)-1)+1) and @PageSize*@PageIndex
endelse begin
select * from #b where rowNumber between @PageSize*((@PageIndex)-1) and @PageSize*@PageIndex
end set @Recount = (select COUNT(*) from #b)
print @Recount
drop Table #b
END
END
4.拼接SQL语句
USE [CDM]
GO
/****** Object: StoredProcedure [dbo].[p_GetHistoryFlight] Script Date: 2018/12/29 14:32:42 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROC [dbo].[p_GetHistoryFlight]
@PageIndex int,
@PageSize int,
@GsName nvarchar(20),
@StartTime datetime,
@EndTime datetime,
@DepAddr nvarchar(25),
@ArrAddr nvarchar(25),
@TimeDiff int,
@Recount int output
AS
BEGIN
declare @sql nvarchar(1000)
declare @countSql nvarchar(1000)
declare @where nvarchar(1000) =' WHERE 1=1 '
declare @cols nvarchar(1000) =' Id,CONVERT(INT,FlightId) AS FlightId,Calsign,FlyTypeName,GsName,AcfTypeName,Stand,Etd,CTOT,Atd,Eta,Ata,TOBT,ApplicateTime,DepAddrName,ArrAddrName,1 AS TimeDiff '
declare @sort nvarchar(50) =' ORDER BY Etd desc'
if @StartTime IS NOT NULL
BEGIN
set @where=@where+' AND Etd>='''+CONVERT(nvarchar,@StartTime)+''''
END
if @EndTime IS NOT NULL
BEGIN
set @where=@where+' AND Etd<='''+CONVERT(nvarchar,@EndTime)+''''
END
if @DepAddr<>''
BEGIN
SET @where=@where + ' AND DepAddrName LIKE ''%'+@DepAddr+'%'''
END
if @DepAddr<>''
BEGIN
SET @where=@where + ' AND ArrAddrName LIKE ''%'+@ArrAddr+'%'''
END
print(@where)
if @GsName<>''
BEGIN
set @where=@where+' AND GsName LIKE ''%'+@GsName+'%'''
END
set @sql=N'SELECT TOP '+STR(@PageSize) +' * FROM ( SELECT ROW_NUMBER() OVER(ORDER BY Id desc) as rowid, ' + @cols +' FROM [CDM].[dbo].[ValidFlightHistory] ' +@where +') AS A WHERE rowid>'+STR(@PageSize*((@PageIndex)-1))
print @sql
exec(@sql)
set @countSql=N'SELECT @total=count(*) FROM [CDM].[dbo].[ValidFlightHistory] '+@where
print @countSql
exec sp_executesql @countSql,N'@total int out',@total=@Recount out
END
select * from (select row_number() over(order by a.id desc) as row,A.Id, B.MaterialName,A.BatchCode,A.SaveTime,A.CompleteQuantity,A.IsQuality
from ZJ_BatchInformation as a,ZJ_BatchNumMaterial as b where A.BatchNumRuleCode=B.BatchNumRuleCode ) TT where tt.row between 1 and 20
select * from(
select *, ROW_NUMBER() OVER(order by Id asc) row from
(select p.*,s.Sheng,i.Shi,a.PinPai
from [dbo].[ProductRecordInfo]
p left join [ShengInfo] s on p.ShengInfo = s.ShengId
left join [ShiInfo] i on p.ShiInfo = i.ShiId
left join[dbo].[PinPaiInfo] a on p.PinPaiInfo=a.Aid)t1)t2
where t2.Row between 1 and 3