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

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

大致的存储过程:

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. Centos7 关闭防火墙(Firewalld ),使用防火墙(iptables)

    1.直接关闭防火墙 systemctl stop firewalld.service: #停止firewall systemctl disable firewalld.service: #禁止fire ...

  2. WCF中的流

    https://msdn.microsoft.com/zh-cn/library/ms733742.aspx

  3. Eclipse 调试的时候Tomcat报错启动不了

    Eclipse 调试的时候Tomcat报错启动不了 1.把所有的断点删掉 2.清理工程 3.在Tomcat里面删除项目 4.删除Tomcat的配置,重新配置一下

  4. sql-按周输出每月的周日期范围

    --日期参数,此处可以建立存储过程,接收月份,计算月开始结束时间或者直接接受开始与结束时间 declare @begDate datetime = '2014-06-01' declare @endD ...

  5. 长时间停留在calculating requirements and dependencies 解决方案

    如果Eclipse花费了很长的时间calculating requirements and dependencies(计算需求和依赖性 ) 这个问题通常就是在点击安装之后显示“Calculating ...

  6. ServerSocket

    在网上找ServerSocket看到的解释

  7. ubuntu host备份 ubuntu无法解析主机

    /etc/hosts # Copyright (c) 2014-2016, racaljk.# https://github.com/racaljk/hosts# Last updated: 2016 ...

  8. Sublime Text 3 个人开发习惯

    1.添加author.date到函数注释里面 docblockr插件 a.preferences--package settings--docblockr--settings-user点击打开 b.在 ...

  9. OC中字符串的提取与替换-四种不同方法实现

    /* 1.将可变字符串 @"When I was young, I loved a girl in neighbor class."中,从 young提取到girl.替换 成@&q ...

  10. python成长之路【第十篇】:浅析python select模块

    一.select介绍 select()的机制中提供一fd_set的数据结构,实际上是一long类型的数组, 每一个数组元素都能与一打开的文件句柄(不管是Socket句柄,还是其他文件或命名管道或设备句 ...