使用CTE查询

原创 2007年10月11日 09:27:00

以下是我在csdn的sql server版提问的问题,以及得到的回答

数据库是sql server express 2005的;

表名是table1;
表的结构:productid(产品代码)、price(价格)、discount(折扣)、supplyid(供应商代码)
主键是productid+supplyid

表的内容:
productid price discount supplyid
0001 0.5 0.02 1
0001 0.4 0.03 2
0001 0.4 0.01 3
0002 1 0 1
0002 0.8 0 2
0002 0.9 0 3
0003 0.8 0.02 1
0003 0.7 0.01 2
0003 0.8 0.03 3


无论纪录有多少条,supplyid只有3个,即为1,2,3
productid可能有很多,上面的只是例子
寻找一条sql查询语句,要求:
查出每一个productid,discount最小的那一行,对于每个productid,只给出合适的一条纪录
上面那表查询的结果应该为(对于discount一样的,给出任一行就行了)
0001 0.4 0.01 3
0002 1 0 1
0003 0.4 0.01 3

create table table1
(productid
varchar(10), price float, discount float, supplyid int)

insert table1
select '0001', 0.5, 0.02, 1
union all select '0001', 0.4, 0.03, 2
union all select '0001', 0.4, 0.01, 3
union all select '0002', 1, 0, 1
union all select '0002', 0.8, 0, 2
union all select '0002', 0.9, 0, 3
union all select '0003', 0.8, 0.02, 1
union all select '0003', 0.7, 0.01, 2
union all select '0003', 0.8, 0.03, 3

With cte
AS
(
select row_number() over (order by productid, discount) as rowid, productid, price, discount, supplyid
from table1)

select c.productid, c.price, c.discount, c.supplyid from cte c
JOIN
(
select productid, min(rowid) as rowid from cte
group by productid
)t
ON c.productid = t.productid AND c.rowid = t.rowid

SQL Server CTE 递归查询全解

最近工作中遇到了一个问题,需要根据保存的流程数据,构建流程图。数据库中保持的流程数据是树形结构的,表结构及数据如下图: 仔细观察表结构,会发现其树形结构的特点: FFIRSTNODE:标记是否...
  • 3150379
  • 3150379
  • 2017年02月04日 20:09
  • 2269

sql中with的用法(CTE公用表表达式):应用子查询嵌套,提高sql性能

一.WITH AS的含义 WITH AS短语,也叫子查询部分(subquery factoring),定义一个SQL片断,该片断会被整个SQL语句所用到。有时是为了让SQL语句的可读性更高些,也可能...
  • longshenlmj
  • longshenlmj
  • 2013年07月09日 21:41
  • 1623

SQL SERVER公用表表达式 (CTE)的用法和运用场景

sql server 2005开始推出了公用表表达式 (CTE),这个表达式是个人觉得挺有用的。 我主要是用于树结构的递归查询和简化sql语句增加可读性和可维护性。 公用表表达式其实提供的功能...
  • jsjpanxiaoyu
  • jsjpanxiaoyu
  • 2017年01月26日 17:55
  • 1417

SQL Server 2008中的CTE递归查询得到一棵树(按照每颗树的架构排列)

感觉这个CTE递归查询蛮好用的,先举个例子:   [c-sharp] view plain copy  print? use City;   "http://lib.csdn.net...
  • goodyuedandan
  • goodyuedandan
  • 2017年04月17日 14:50
  • 1022

mysql的cte(公用表表达式)

(一)公用表表达式是一个命名的临时结果集,仅在单个SQL语句(例如SELECT,INSERT,UPDATE或DELETE)的执行范围内存在。 查询中的列数必须与column_list中的列数相同。 ...
  • qq30211478
  • qq30211478
  • 2017年08月09日 13:51
  • 692

SQL CTE学习总结

一句SQL完成动态分级查询 http://www.cnblogs.com/powertoolsteam/p/sqlite.html 在最近的活字格项目中使用ActiveReports报表设计器设计一个...
  • bcbobo21cn
  • bcbobo21cn
  • 2017年05月03日 21:12
  • 527

Oracle 11g中CTE应用示例

关于SQL SERVER中的CTE中的CTE应用,请看这里:http://blog.csdn.net/downmoon/archive/2009/10/23/4715814.aspx 其实,ORAC...
  • sunpeng1117
  • sunpeng1117
  • 2015年11月13日 15:12
  • 625

SQL With(递归 CTE 查询)

From: http://www.cnblogs.com/smailxiaobai/archive/2012/01/16/2323291.html 指定临时命名的结果集,这些结果集称为公用表表达...
  • DJ2008
  • DJ2008
  • 2017年12月24日 13:49
  • 47

SQL With(递归 CTE 查询)

原文链接:  http://www.cnblogs.com/smailxiaobai/archive/2012/01/16/2323291.html 小白一个,努力学习中。。。 ...
  • zxz414644665
  • zxz414644665
  • 2014年02月18日 10:44
  • 740

WITH CTE递归查询

资料来源: http://msdn.microsoft.com/zh-cn/library/ms175972(v=SQL.90).aspx http://www.cnblogs.com/sma...
  • YELLOWANCE
  • YELLOWANCE
  • 2014年10月30日 14:10
  • 352
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:使用CTE查询
举报原因:
原因补充:

(最多只允许输入30个字)