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

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

大致的存储过程:

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. No module named 'urllib2'

    import urllib2 response = urllib2.urlopen('http://www.baidu.com/') html = response.read() print html ...

  2. dubbo配置文件报错解决方案

    下载dubbo.xsd 文件 在eclipse->window->perferences->XML Catalog->Add ->File system->选择刚才 ...

  3. css伪类的展现

    常见的伪类选择器 :link :hover :active :visited 如果为以上几个伪类赋予相同css属性名,不同的css属性值 <!DOCTYPE html> <html ...

  4. 软件工程(C编码实践篇)总结

    陆伟丹 + 原创作品转载请注明出处 + <软件工程(C编码实践篇)>MOOC课程http://mooc.study.163.com/course/USTC-1000002006 对软件工程 ...

  5. Sprint(第八天11.21)

  6. Jquery实现图片轮换效果

    最近在看jquery书时,看到一个比较有趣的东西:图片轮换.这里和大家分享下我看完后写的一个demo.实现图片轮换要完成三部分模块:html部分.css部分.jqury部分.下面分步详细说明.1.ht ...

  7. batch

    %0  当前 batch 文件名  %n  第 n 个命令行参数(1 <= n <= 9)  %*  所有的命令行参数  @echo off echo % echo % if not &q ...

  8. SVN版本号打包脚本工具

    做网页游戏开发的时候,经常会触及到对文件版本号的管理.最近由于做新项目的原因,把原来手写版本号的方法改进了一下,借由svn的版本号生成及用java写了个xml解析输出文件,把手动的东西都变成全自动. ...

  9. Asp.NET利用ClientScript.RegisterStartupScript("")的同学,请注意!

    如果你想要在aspx.cs 文件用利用 ClientScript.RegisterStartupScript(""); 方法动态在DOM中执行脚本(比如想要将后置代码中的验证结果信 ...

  10. java第一天

    今天完成的事情:   [主线]   1.什么是接口???      接口(interface)是类与类之间的一种约定,一般而言,实现某个接口,意味着该类必须实现接口中的所有方法.   2.接口的特性. ...