select into tb_temp2 from tb_temp1 创建临时表实现上一个、下一个功能,使用完毕就删除临时表

好久没有写过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 [email protected]_id
)
)

select top 1 * from tb_temp where sno=((select sno from tb_temp where [email protected]_id)[email protected]_no) order by sno asc
drop table tb_temp

go

exec proc_GetAdjacentWithSameProType 827,-5

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

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

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

2:排序后往下数第二个

....

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

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

.....

欢迎讨论,增加知识

时间: 2024-10-05 18:44:33

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

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

Mysql 创建表之前判断表是否存在,如果存在则删除已有表 DROP TABLE IF EXISTS sys_area; CREATE TABLE sys_area ( id varchar(64) NOT NULL COMMENT '编号', parent_id varchar(64) NOT NULL COMMENT '父级编号', parent_ids varchar(2000) NOT NULL COMMENT '所有父级编号', name varchar(100) NOT NULL C

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

删除临时表空间,或者收缩临时表空间经常会出现表空间占用等情况. 下面我们就对这种情况进行处理, 首先查找被锁的sid: SELECT a.INST_ID,b.TABLESPACE , b.segfile# , b.segblk# , ROUND ( ( ( b.blocks * p.VALUE ) / 1024 / 1024 ), 2 ) size_mb , a.SID , a.serial# , a.username , a.osuser , a.program , a.status FROM

删除临时表空ora-25152错误

删除临时表空间,或者收缩临时表空间经常会出现表空间占用等情况. 下面我们就对这种情况进行处理, 首先查找被锁的sid: SELECT a.INST_ID,b.TABLESPACE , b.segfile# , b.segblk# , ROUND ( ( ( b.blocks * p.VALUE ) / 1024 / 1024 ), 2 ) size_mb , a.SID , a.serial# , a.username , a.osuser , a.program , a.status FROM

第五章:创建高性能索引(上)

索引是存储引擎用于快速找到记录的一种数据结构,这也是索引的基本功能.在MySQL中也叫"键key".良好的性能少不了索引.换句话说,索引优化能够将查询性能轻松提高几个数量级. 1. 索引基础 select first_name from actor where actor_id = 5; 运行上面的查询:如果在actor_id列上有索引,MySQL将使用该索引去查找actor_id为5的列,也就是说:MySQL先在索引上按值查找,然后返回包含该值的数据行. 索引可以包含一个或多个列,列

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

转载地址:http://blog.csdn.net/numbibi/article/details/8026841 在home目录下有wwwroot目录,wwwroot下有sinozzz目录,即/home/wwwroot/sinozzz 一.目录创建 在/home/wwwroot目录下新建一个sinozzz123的文件夹 mkdir /home/wwwroot/sinozzz123 二.目录复制 1.把/home/wwwroot/sinozzz里面的文件和文件夹等复制到home/wwwroot/

创建一个提供搜索功能的搜索类(可运行)

/* * 这段代码的主要功能是对于创建索引的后的文件, * 创建一个提供搜索功能的搜索类. * */ package ch2.lucenedemo.process; import java.io.BufferedReader; import java.io.File; import java.io.FileReader; import java.io.IOException; import java.util.Date; import java.util.Iterator; import jav

Nodejs express中创建ejs项目,解决express下默认创建jade,无法创建ejs问题

最近在看<Node.js开发指南>,看到使用nodejs进行web开发的时候,准备创建ejs项目遇到问题了, 书上命令为: ? 1 express -t ejs microblog 可是执行后,仍旧创建的是jade项目. 原来,express3.x,express4.x中创建ejs命令更新为: express -e microblog //即ejs,-j(即jade)  当然,最直接的,你也可以修改package.json里的定义来实现安装ejs. PS:建立工程过程 1.必须得安装expre

使用MVC5+Entity Framework6的Code First模式创建数据库并实现增删改查功能

此处采用VS2017+SqlServer数据库 一.创建项目并引用dll: 1.创建一个MVC项目 2.采用Nuget安装EF6.1.3 二.创建Model 在models文件夹中,建立相应的model文件,这里建立的class名,就是数据库里表的名字.        在这里面,可以建立表之间的关系,本次将建立Course(课程).Student(学生).StuCourse(课程学生关系)来作为一个Demo [Table("t_course")]   //可以通过Attribute的形

创建一个提供搜索功能来搜索类(可执行文件)

/* * 这段代码的主要功能是后创建文件的索引. * 创建一个提供搜索功能来搜索类. * */ package ch2.lucenedemo.process; import java.io.BufferedReader; import java.io.File; import java.io.FileReader; import java.io.IOException; import java.util.Date; import java.util.Iterator; import java.u