好久没有写过Sql了,今天遇到一个问题,业务逻辑是:

一个商品可以属于多个分类,在显示商品详情的时候,要求可以点击“上一个”,“下一个” 查看和该商品在同一个分类下的其他商品,商品具有排序号。

这样我就开始写了第一个sql:

select top 1 ROW_NUMBER() over(order by p_order asc) as sno,* from dbo.App_Product
where p_id in
(
select p_id from App_ProductTypeRelation
where pt_id in
(
select pt_id from dbo.App_ProductTypeRelation where p_id=827
)
)
and p_order>(select p_order from App_Product where p_id=827)

但是当我再点击“下一个”的时候,下一个商品所属的分类和上一个的商品所属的分类不同了(商品A:分类1,分类2,商品B:分类2,分类3)

这样就会出现一个新的查询结果,如果我再点击“上一个”,就回不到刚才的商品了,晕了。

后来我就又写了一个sql:

select * from
(
  select top 1 ROW_NUMBER() over(order by p_order asc) as sno,* from dbo.App_Product
  where p_id in
  (
    select p_id from App_ProductTypeRelation
    where pt_id in
    (
      select pt_id from dbo.App_ProductTypeRelation where p_id=827
    )
  )
) as tb1
where sno>(select sno from tb1 where p_id=827)

这样逻辑是对的,但是最后的where语句是不对的,就是where sno>(select sno from tb1 where p_id=827)中的tb1错误,我没查到怎么解决问题,有高手请指教下。

后来我想到,可以把结果放到实际表中,用完删了(过河拆桥)就好了,但是这样的效率肯定不会好,

但是我也想不到怎么解决了,先这么着吧,日后再研究,呵呵,于是就有了下面的Sql:

if exists(select * from sys.objects where name='proc_GetAdjacentWithSameProType')
drop proc proc_GetAdjacentWithSameProType
go
create procedure proc_GetAdjacentWithSameProType
@p_id int=0,
@add_no int=0
as

declare @sql varchar(max)
if exists(select * from sys.objects where name='tb_temp')
drop table tb_temp

select ROW_NUMBER() over(order by p_order asc) as sno,* into tb_temp from dbo.App_Product
where p_id in
(
select p_id from App_ProductTypeRelation
where pt_id in
(
select pt_id from dbo.App_ProductTypeRelation where p_id=@p_id
)
)

select top 1 * from tb_temp where sno=((select sno from tb_temp where p_id=@p_id)+@add_no) order by sno asc
drop table tb_temp

go

exec proc_GetAdjacentWithSameProType 827,-5

用法是传入当前商品的id,这个是固定不变的,点击“下一个”或者“上一个”,永远都是传当前商品的id,

只是第二个参数:当前商品的上下第n个,

1:排序后往下数第一个,

2:排序后往下数第二个

....

-1:排序后往 上 数第一个

-2:排序后往 上 数第二个

.....

欢迎讨论,增加知识

select into tb_temp2 from tb_temp1 创建临时表实现上一个、下一个功能,使用完毕就删除临时表的更多相关文章

  1. [转]Oracle 修改或者删除临时表 ORA-14452: 试图创建, 更改或删除正在使用的临时表中的索引

    本文转自:http://blog.csdn.net/treasurelifelhf/article/details/7290729 由于存储过程出现问题,导致前台页面无法显示数据.执行存储过程发现临时 ...

  2. sql server创建临时表的两种写法和删除临时表

    --创建.删除临时表 --第一种方式 create table #tmp(name varchar(255),id int) --第二种方式 select count(id) as storyNum ...

  3. MYSQL- 创建和删除临时表

    临时表可能是非常有用的,在某些情况下,保持临时数据.最重要的是应该知道的临时表是,他们将当前的客户(www.111cn.net)端会话终止时被删除 当你创建临时表的时候,你可以使用temporary关 ...

  4. SQL Server数据库的存储过程中定义的临时表,真的有必要显式删除临时表(drop table #tableName)吗?

    本文出处:http://www.cnblogs.com/wy123/p/6704619.html 问题背景 在写SQL Server存储过程中,如果存储过程中定义了临时表,有些人习惯在存储过程结束的时 ...

  5. oracle创建表之前判断表是否存在,如果存在则删除已有表

    Mysql 创建表之前判断表是否存在,如果存在则删除已有表 DROP TABLE IF EXISTS sys_area; CREATE TABLE sys_area ( id int NOT NULL ...

  6. 删除临时表空间ora-25152错误

    删除临时表空间,或者收缩临时表空间经常会出现表空间占用等情况. 下面我们就对这种情况进行处理, 首先查找被锁的sid: SELECT a.INST_ID,b.TABLESPACE , b.segfil ...

  7. input与select 设置相同宽高,在浏览器上却显示不一致,不整齐

    遇到 input与select 设置相同宽高,在浏览器上却显示不一致,遂实验了下(IE 10.013 ,Firefox 30.0),得出以下结论 input   width,height 值里面, 不 ...

  8. linux下文件夹的创建、复制、剪切、重命名、清空和删除命令

    在home目录下有wwwroot目录,wwwroot下有sinozzz目录,即/home/wwwroot/sinozzz 一.目录创建 在/home/wwwroot目录下新建一个sinozzz123的 ...

  9. 解决iPhone上select时常失去焦点,随意跳到下一个输入框,影响用户操作

    window.addEventListener('load', function() { FastClick.attach(document.body); }, false); //300s延迟,解决 ...

随机推荐

  1. python学习笔记之斐波拉契数列学习

    著名的斐波拉契数列(Fibonacci),除第一个和第二个数外,任意一个数都可由前两个数相加得到: 1, 1, 2, 3, 5, 8, 13, 21, 34, ... 如果用Python的列表生成式, ...

  2. RabbitMQ系列教程之五:主题(Topic)(转载)

    RabbitMQ系列教程之五:主题(Topic) (本实例都是使用的Net的客户端,使用C#编写),说明,中文方括号[]表示名词. 在上一个教程中,我们改进了我们的日志记录系统. 没有使用只能够进行虚 ...

  3. 迷你MVVM框架 avalonjs1.5.2 发布

    经过2个小版本的试水, avalon1.5这个全新的架构也终于成熟了. 首先是组件的配置项,名字改了不少,让大家都满意. ms-duplex, ms-include, ms-if等指令的BUG修复. ...

  4. Android DevArt5:如何在Android中创建多线程?

    本篇内容: 如何在Android中创建多进程?查看进程的三种方式有哪些? 多进程模式的运行机制?- 演示了多进程出现问题中的两种情况: 静态成员失效 Application多次创建 IPC基础概念介绍 ...

  5. MVC part4

    SpringMVC 注解 @Controller 负责注册一个bean 到spring 上下文中,bean 的ID 默认为类名称开头字母小写,你也可以自己指定, 如下 方法一: @Controller ...

  6. 远程批量查看windosws操作系统3389端口的开放情况

    本文只提供思想.具体可以根椐情况拓展. 前提是需要配置远程主机的SNMP协议.主要是共同体哟. 脚本使用: 1.拷贝check_tcp到脚本执行的主机中或在此主机中安装nagios; 2.保持list ...

  7. 吴裕雄 python深度学习与实践(2)

    #coding = utf8 import threading,time,random count = 0 class MyThread (threading.Thread): def __init_ ...

  8. matlab 画二维图与三维图

    二维图 ezplot('sin(x)');%默认范围 ezplot('sin(x)',[-4 4]);%自己设定范围 三维图 ezmesh('x*x+y*y');%默认范围

  9. 在maven中classpath notfund

  10. oracleXE数据库没有公开wm_concat函数, 需要手动添加

    CREATE OR REPLACE TYPE wm_concat_impl AUTHID CURRENT_USER AS OBJECT ( curr_str ), STATIC FUNCTION od ...