最近在开发一个外包的项目,其中有个需求,一直困扰我好几天,今天终于找到了解决方案。大致需求如下:公司总部发货给经销商,其中经销商包含四种级别,钻石、金牌、银牌和铜牌,等级依次下发,钻石包含金牌,金牌包含银牌,银牌包含铜牌,铜牌下面有终端客户,也就是产品的终端,给客户使用。

如果系统登陆的是钻石经销商,需要查询他的客户,需要把最底层的经销商查出来,最后,查询所属的终端客户。

大致的存储过程:

USE [DbDevice]
GO
/****** Object:  StoredProcedure [dbo].[Pro_FindMaterialByTerminalId]    Script Date: 07/14/2014 14:21:39 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author:  <Author,,Name>
-- Create date: <Create Date,,>
-- Description: <Description,,>
-- =============================================
ALTER PROCEDURE [dbo].[Pro_FindMaterialByTerminalId]
@DealerId varchar(50),
@MaterialName varchar(50),
@StartDate varchar(50),
@EndDate varchar(50)
AS
BEGIN
 SET NOCOUNT ON;
 declare @where varchar(1000)
 declare @sql varchar(1000)
 declare @select varchar(800)
 declare @order varchar(100)
 declare @type int
 set @where=' '
 set @sql=''
 set @select=''
 set @order=''
 set @type=(select t.Level from Tbl_Dealer t where t.DealerId=@DealerId)
 
 if(@MaterialName<>'') set @where=@where+' And A1.SerialNumber='+@MaterialName
 set @where=@where+' And A1.UseTime>='''+@StartDate+''' And A1.UseTime<='''+@EndDate+''''
 
 if(@type=0)
 begin
      set @select=' select A1.TypeId,A1.SerialNumber,A1.CreateTime,B1.TerminalName,A1.Barcode,A1.ProvinceId,A1.DeviceId,A1.UseTime, A1.Status  from Tbl_Material A1 ,Tbl_Terminal B1
      
      where A1.TerminalId=B1.TerminalId And A1.TerminalId in (select A.TerminalID
    from Tbl_Terminal A
    where A.DealerId in (select H.DealerId From Tbl_Dealer H where H.ParentId in(
   select G.DealerId From Tbl_Dealer G where G.ParentId in(
   select F.DealerId From Tbl_Dealer F where F.ParentId in
   (select E.DealerId from Tbl_Dealer E where E.DealerId='''+@DealerId+''')))))'
 end
 if(@type=1)
 begin
    set @select=' select A.TerminalID
    from Tbl_Terminal A
    where A.DealerId in (
   select G.DealerId From Tbl_Dealer G where G.ParentId in(
   select F.DealerId From Tbl_Dealer F where F.ParentId in
   (select E.DealerId from Tbl_Dealer E where E.DealerId='''+@DealerId+''')))'
 end
 if(@type=2)
 begin
   set @select=' select A.TerminalID
    from Tbl_Terminal A
    where A.DealerId in (
   select F.DealerId From Tbl_Dealer F where F.ParentId in
   (select E.DealerId from Tbl_Dealer E where E.DealerId='''+@DealerId+'''))'
 end
 if(@type=3)
 begin
   set @select=' select A.TerminalID
    from Tbl_Terminal A
    where A.DealerId in (
   select E.DealerId from Tbl_Dealer E where E.DealerId='''+@DealerId+''')'
 end
 
 set @order=' order by A1.UseTime desc'
 set @sql=@select+@where+@order
 print @sql
 exec (@sql)
END

sql 多级内查询的更多相关文章

  1. C#构造方法(函数) C#方法重载 C#字段和属性 MUI实现上拉加载和下拉刷新 SVN常用功能介绍(二) SVN常用功能介绍(一) ASP.NET常用内置对象之——Server sql server——子查询 C#接口 字符串的本质 AJAX原生JavaScript写法

    C#构造方法(函数)   一.概括 1.通常创建一个对象的方法如图: 通过  Student tom = new Student(); 创建tom对象,这种创建实例的形式被称为构造方法. 简述:用来初 ...

  2. 关系数据库SQL之基本数据查询:子查询、分组查询、模糊查询

    前言 上一篇关系数据库常用SQL语句语法大全主要是关系型数据库大体结构,本文细说一下关系型数据库查询的SQL语法. 语法回顾 SELECT [ALL|DISTINCT] <目标列表达式>[ ...

  3. sql跨库查询

    ---------------------------------------------------------------------------------- --1. 创建链接服务器 --1. ...

  4. SQL表连接查询(inner join、full join、left join、right join)

    SQL表连接查询(inner join.full join.left join.right join) 前提条件:假设有两个表,一个是学生表,一个是学生成绩表. 表的数据有: 一.内连接-inner ...

  5. SQL Server 内置函数、临时对象、流程控制

    SQL Server 内置函数 日期时间函数 --返回当前系统日期时间 select getdate() as [datetime],sysdatetime() as [datetime2] getd ...

  6. SQL语句 - 嵌套查询

    嵌套查询的意思是,一个查询语句(select-from-where)查询语句块可以嵌套在另外一个查询块的where子句中,称为嵌套查询.其中外层查询也称为父查询,主查询.内层查询也称子查询,从查询. ...

  7. [.NET] SQL数据分页查询

    [.NET] SQL数据分页查询 程序下载 范例下载:点此下载 原始码下载:点此下载 NuGet封装:点此下载 数据查询 开发系统时,使用C#执行SQL查询指令,就可以从SQL数据库里查询所需数据. ...

  8. 如何在 Linux 上用 SQL 语句来查询 Apache 日志

    Linux 有一个显著的特点,在正常情况下,你可以通过日志分析系统日志来了解你的系统中发生了什么,或正在发生什么.的确,系统日志是系统管理员在解决系统和应用问题时最需要的第一手资源.我们将在这篇文章中 ...

  9. 50种方法优化SQL Server数据库查询

    查询速度慢的原因很多,常见如下几种: 1.没有索引或者没有用到索引(这是查询慢最常见的问题,是程序设计的缺陷) 2.I/O吞吐量小,形成了瓶颈效应. 3.没有创建计算列导致查询不优化. 4.内存不足 ...

随机推荐

  1. C++多线程の线程通信future,promise,async

  2. 关于工程结合git的配置

    我们通常把代码放到git sever中,(scm manager)中,上传,下载代码, 可是通常工程的代码改动会有图标提示,改动过的,或者新增的,那么需要在eclipse的工程中做一下简单配置 1,工 ...

  3. mybatis 如何使用乐观锁

    悲观锁的问题: 因为悲观锁大多数情况下依靠数据库的锁机制实现,以保证操作最大程度的独占性.如果加锁的时间过长,其他用户长时间无法访问,影响了程序的并发访问性,同时这样对数据库性能开销影响也很大,特别是 ...

  4. hive的使用03

    1.hive中的四种排序 1.1 order by :对全局进行排序,只能有一个reduce select * from hive.employee order by id;

  5. 双十一 VS 火车票(12306)

    火车票开售了,又是一年,code了一年,咱们也该回顾回顾了. 还记得12306上线之初各种技术大牛给人家出方案,吐槽人家外包费用?我们来回顾回顾. 就园子里都过千篇文章来侃这事儿,请问有多少主题的文章 ...

  6. Oracle(修改表结构和约束)

    目标: 1.添加和修改列 2.添加,enable,disable,或者remove约束 3.删除表 4.删除表中所有数据并回到表定义的初始状态(截断表) 5.修改对象的名字 6.给对象添加注释,从数据 ...

  7. .zip版初次安装mysql时遇到的my.ini、服务无法启动以及设置登录密码的问题

    下载mysql出现的问题 若下载的是.zip版,就是免安装的直接解压就可以的出现的问题 一.需要在E:\mysql\mysql-5.7.14-winx64目录下手动添加my.ini文件(.ini文件是 ...

  8. Query Designer:Exception,不同的值显示不同的颜色

    声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...

  9. 用CSS3和Canvas来画网格

    我们经常使用一些excel表格来处理数据,在html中,我们可以用table来制成表格.今天来看一下一些不同的方法. 方法一:使用CSS3的background的linear-gradient属性 l ...

  10. iOS - iOS 应用

    1.Xcode 项目属性 Product Name 软件名称.产品名称.项目名称 Organization Name 公司名称.组织名称 Organization Identifier 公司的唯一标识 ...