数据库中复杂的联查+筛选条件+排序+分页

数据库中复杂的联查+筛选条件+排序+分页一直是比较头疼的问题

为了模拟这个问题,首先建立两个表

create table t_userType (
    id int identity(1,1) not null primary key,
    name varchar(50)
)
GO

create table t_user (
    id int identity(1,1) not null primary key,
    t_userTypeId int not null,
    name varchar(50),
    foreign key (t_userTypeId) references t_userType(id)
)
GO

下面插入一些测试数据

  

在t_user这个表中,t_userTypeId字段关联到了t_userType这个表

我们希望在查询用户时,同时查询到这个用户类型的name,可以通过联查实现

select u.*, t.name as typeName
    from t_user u
    inner join t_userType t
    on t.id = u.t_userTypeId

如果联查的表多了,就会比较复杂,所以建立一个视图

create view view_user_andType
as
    select u.*, t.name as typeName
    from t_user u
    inner join t_userType t
    on t.id = u.t_userTypeId
go

这时,使用下面的语句,就能得到我们想要的结果

select * from view_user_andType

如果想提供分页功能的话,需要这样写

select top 5 * from view_user_andType where id not in (select id top 0 view_user_andType)

加入条件过滤和排序

select top 5 * from view_user_andType
where id>1 and
    id not in (
        select top 0 id view_user_andType
        where id>1 order by id)
order by id

如果每个表的联查都写成这样,也是比较头大的

所以通过一个存储过程,封装分页和排序逻辑

-- 存储过程:通用分页
--
-- 分页查询某个表或视图
--
-- 参数列表:
--        srcTableName:视图或表名
--        idColumnName:主键列名
--        pageSize:每页长度(1~n)
--        pageIndex:页码(1~n)
--        condition:过滤条件
--        orderBy:排序方式,必须为查询结果中的字段名
--        isDesc:是否倒序,可选值(true, false)
--
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_NULLS ON
GO
IF OBJECT_ID ( ‘proc_selectByPage‘, ‘P‘ ) IS NOT NULL
    Drop PROCEDURE [proc_selectByPage];
GO
create  procedure [dbo].[proc_selectByPage]
    @srcTableName varchar(50),
    @idColumnName varchar(50) = ‘id‘,
    @pageSize int = 10,
    @pageIndex int = 1,
    @condition varchar(500) = ‘‘,
    @orderBy varchar(50),
    @isDesc varchar(50) = ‘false‘
AS
begin

    -- 参数容错
    if (@pageIndex <= 0)
    begin
        set @pageIndex = 1
    end

    -- 组装语句
    declare @sql1 varchar(4000)
    set @sql1 = ‘select top ‘ + cast (@pageSize as varchar(50)) +
                ‘ * from ‘ + @srcTableName +
                ‘ where (‘ + @idColumnName +
                        ‘ not in (select top ‘ + cast ((@pageSize * (@pageIndex-1)) as varchar(50)) +
                        ‘ ‘ + @idColumnName +
                        ‘ from ‘ + @srcTableName

    if ( @condition <> ‘‘ )
    begin
        set @sql1 = @sql1 + ‘ where ‘ + @condition
    end

    set @sql1 = @sql1 + ‘ order by ‘ + @orderBy

    if ( @isDesc = ‘true‘ )
    begin
        set @sql1 = @sql1 + ‘ desc ‘;
    end
    else if ( @isDesc = ‘false‘ )
    begin
        set @sql1 = @sql1 + ‘ asc ‘;
    end

    set @sql1 = @sql1 + ‘  ) ‘

    if ( @condition <> ‘‘ )
    begin
        set @sql1 = @sql1 + ‘ and ‘ + @condition
    end

    set @sql1 = @sql1 + ‘)‘

    set @sql1 = @sql1 + ‘ order by ‘ + @orderBy

    if ( @isDesc = ‘true‘ )
    begin
        set @sql1 = @sql1 + ‘ desc ‘;
    end
    else if ( @isDesc = ‘false‘ )
    begin
        set @sql1 = @sql1 + ‘ asc ‘;
    end

    -- 输出语句,并执行
    print @sql1
    exec(@sql1)

end
GO
SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS ON
GO

再实现相同的功能就可以这样写

exec proc_selectByPage ‘view_user_andType‘, ‘id‘, 3, 2, ‘‘, ‘name‘, ‘false‘

可以兼容表或视图的分页,sqlserver2000下测试通过

原文地址:http://www.cnblogs.com/S-E-P/archive/2012/06/10/2543970.html

小蚁商品中不同:主产品,产品下多个规格   先以主产品分页,然后更加主产品ID集合再查找子产品,最后进行关联用代码实现

时间: 2024-10-12 07:56:52

数据库中复杂的联查+筛选条件+排序+分页的相关文章

在数据库中加一个字段并给予排序

在数据库中加一个字段,见给数据库加字段部分的介绍 在ALL的TWIG中理性按键的类型,来增加排序功能如下:                <th>状态<br/><a class="asc" data-id="status=asc">正序</a> | <a class="desc" data-id="status=desc">倒序</a></th>

MySQL 中 on与where筛选条件的区别

在两张表连接的时候才会有on的筛选条件,那么on和where的区别是什么呢? 在inner join中是没有区别的,但是在左连接和右连接中,区别就体现出来了,下面以左连接为例: 1.用on的时候,只对右表做筛选条件,而左表不受控制 2.用where的时候,对临时表的组合后的结果进行筛选,所以对左右表都是有作用的. 如下示例: 原文地址:https://www.cnblogs.com/fish-101/p/12076786.html

hibernate中带查询条件的分页

所谓分页,从数据库中分,则是封装一个分页类.利用分页对象进行分页. 但,分页往往带查询条件. 分页类的三个重要数据:[当前页码数],[数据库中的总记录数],[每页显示的数据的条数] 原理:select * from  [表名] where   [字段名]  like   ['%条件%']    limit  [开始查询的索引],[每页显示的数据] 带查询条件的分页分两步 (1)第一步:查询出符合条件的数据的总条数 ---->select count(*) from [表名] where  [字段

Entity Framewrok 7beta7中不同版本sql server自动生成分页sql语句的问题

在EF中,使用linq进行分页是很方便的,假如我们有一个EMP表,结构如下: public class Emp { [Key] public Guid No { get; set; } public int Age { get; set; } [Required] [StringLength(50)] public string Name { get; set; } } 如果我们进行分页的话,一般使用Skip和Take方法,这里一行最简单的代码如下: mContext.Emp.OrderBy(e

Sliverlight linq中的数组筛选数据库中的数据

首先 什么是linq呢 ? LINQ即Language Integrated Query(语言集成查询),LINQ是集成到C#和Visual Basic.NET这些语言中用于提供查询数据能力的一个新特性. 它是.NET框架的扩展,它允许我们以数据库查询的方式查询数据集合. 借助于LINQ技术,我们可以使用一种类似SQL的语法来查询任何形式的数据. 接下来讲讲我工作中用到的 linq中的数组筛选数据库中的数据 public List GetList1(string cardPhone,string

数据库中的T-sql语句 条件修改 高级查询

1.创建数据库:create database --数据库名,不能中文,不能数字开头,不能符号开头 2.删除数据库:drop database-- 数据库名 use student--使用数据库 3.注释:一段 /* */ 一行 -- 4.创建表: create table 表名            create table 表名            (              列名 数据类型,               ...               ...           

SQL中把筛选条件放在left outer join的on 和 where 后面的区别

create table [Table_1]([PKey] int,[FKey] int,[value1] int,[value2] int)create table[Table_2]([PKey] int,[value1] int,[value2] int)drop table [Table_1]drop table [Table_2]delete[Table_1]delete[Table_2]insert into [Table_1] values(1,0,21,31)insert into

SQL中的where条件,在数据库中提取与应用浅析

来源:深入MySQL内核 1        问题描述 一条SQL,在数据库中是如何执行的呢?相信很多人都会对这个问题比较感兴趣.当然,要完整描述一条SQL在数据库中的生命周期,这是一个非常巨大的问题,涵盖了SQL的词法解析.语法解析.权限检查.查询优化.SQL执行等一系列的步骤,简短的篇幅是绝对无能为力的.因此,本文挑选了其中的部分内容,也是我一直都想写的一个内容,做重点介绍: 给定一条SQL,如何提取其中的where条件?where条件中的每个子条件,在SQL执行的过程中有分别起着什么样的作用

java中list集合的内容,如何使用像数据库中group by形式那样排序

java中list集合的内容,如何使用像数据库中group by形式那样排序,比如:有一个 List<JavaBean> 他中包含了一些如下的内容JavaBean:name    money(名称)  (金额) 来源A   100来源B   200来源C   300来源B   6600来源A   99800<数据1> 最后想实现的是:如果假设这些数据在数据库中,那么通过 select name,sum(money) from Table group by name 该语句得到的Li