选择显示字体大小

t-sql实用例句

t-sql允许你使用不同的方法解决一个问题.有的时候,尽管选择不是那么明显,但是却可以让你得到令人满意的和快乐的惊奇.下边让我们解读几个例子.可能我们可以在那些不同的方法之中发现一些珍贵的东西.

让我们以我们的老朋友northwind数据库为例,这里我们用到的是[order details]表,这个表是一个定单的明细表,和order表是多对一的关系.也就是一个定单对应多个订购的产品.假设你想得到每个定单订购的总价值, 但是不包括59号产品.listing 1给了我们第一种解法:

select orderid,sum (quantity * unitprice) valuefrom[order details] o1whereproductid <> 59group by orderid


上边的语句很简单,它排除掉了59号产品的定单明细条目,然后进行分组统计.但是如果我们需要忽略掉订购59号产品的定单呢?也就是说我们要统计没有包含59号产品的定单的价值.你想到了where, not exist(s)关键词了吗?listing 2给了我们第二种方法:

selecto1.orderid,sum (o1.quantity * o1.unitprice) valuefrom[order details] o1where not exists(select * from [order details] o2whereo2.orderid = o1.orderid and o2.productid = 59)group by o1.orderid


如果你不喜欢用exist的话,你可以转化成使用not in:

listing 3

selecto1.orderid,sum (o1.quantity * o1.unitprice) valuefrom[order details] o1where 59 not in(select productid from [order details] o2whereo2.orderid = o1.orderid)group byo1.orderid


 尽管listing 1不满足我们现在的查询条件.但是从性能发面考虑,listing 1还是最好的,因为它只用到了一次表的扫描.而后边的两个查询都是用到了相关子查询,如果你查看查询计划就回看到,他们都涉及到了两次表的扫描.如果你曾经在t-sql用过交叉表查询的话,你就不会对聚集函数里边的case结构陌生.现在我们就把这个非常有趣的方法应用到我们的问题中来:

listing 4

selectorderid,sum (quantity * unitprice) valuefrom[order details] o1group byorderidhavingsum (case when productid = 59 then 1 else 0 end) = 0


having子句起到了对分组的结果进行过滤的作用.如果没有包含59号产品,就会出现0=0,显然这是满足条件的.如果包含了59号产品的订购,就会出现n=0(n<>0),这样的定单就回被过滤掉.查看执行计划你就回发现是一次表的扫描,非常棒!

再来举一个例子:我们这回用到的表是order表,假设我们要统计只通过一个雇员雇员下定单的顾客.你可以想到用子查询not exist来实现:listing5

select distincto1.customeridfromorders o1where not exists(select*fromorders o2whereo2.customerid = o1.customeridand o2.employeeid <> o1.employeeid)


同样的,这个语句可以通过带有having子句的分组来实现.listing 6

selectcustomeridfromordersgroup bycustomeridhavingmin (employeeid) = max (employeeid)


另一种方法: listing 7

selectcustomeridfromordersgroup bycustomeridhavingcount (distinct employeeid) = 1


listing 6和listing 7查询消耗都要小于listing 5.相比listing 5的两次表扫描,他们只进行一次表的扫描.而listing 6的损耗还要稍微小于listing 7.但是,listing 7的一个显著的特点就是它可以适应到一个顾客对应两个雇员,三个雇员......

这篇文章就是教我们怎么用having子句来达到过滤组的目的.可以达到避免两次表扫描的目的.可以达到更高的性能.(完)


 


关键字 本文所属关键字

相关 与本文相关文章

分类 所有文章关键字导航

源码编程相关

Java   Asp   PHP   .Net   XML   C/C++   CGI   VB   Jsp   J2ee   J2se   J2me   EJB   Servlet   Tomcat   Resin   Struts   Weblogic   Eclipse   ANT   GUI   JMS   Web servise   IDEA   Webphere   Hibernate   Spring   Jboss   Applet   Swing   Socket   Javamail   Perl   Ajax   P2P   安全   模式   框架   测试   开源   游戏

SQL数据库相关

My-SQL   Ms-SQL   Access   DB2   Oracle   Sybase   SQLserver   索引   存储过程   加密   数据库   分页   视图  

手机无线相关

3G   Wap   CDMA   GRPS   GSM   IVR   彩信   短信   无线   增值业务

网页设计制作相关

HTML   CSS   网页配色   网页特效   Javascript   VBscript   Dreamweaver   Frontpage   JS   Web   网站设计

网站建设推广相关

建站经验   网站优化   网站排名   推广   Alexa

操作系统/服务器相关

Windows XP   Windows 2000   Windows 2003   Windows Me   Windows 9.x   Linux   UNIX   注册表   操作系统   服务器   应用服务器

图形图像多媒体相关

Photoshop   Fireworks   Flash   Coreldraw   Illustrator   Freehand   Photoimpact   多媒体   图形图像

标准 网站致力的规范

Valid CSS!

无不良内容,无不良广告,无恶意代码

Valid XHTML 1.0 Transitional

creativecommons