sql server 的多表查询(left join )

今天写了一个sql 弄了三遍才算成功,是以前写sq自己l从来没有注意过得,left join

DECLARE @SendIntervalDays INT ,@OrderIntervalDays INT ,@OrderDate DATETIME

SET @SendIntervalDays=7      --短信发送间隔天数

SET @OrderIntervalDays=30    --订单已签收天数

SET @OrderDate=‘2014-12-12‘  --订单时间

SELECT

O.UserID

,Max(O.OrderID) OrderID

,MAX(MobilePhone) Mobile

FROM View_SaleOrder O WITH(NOLOCK)

LEFT JOIN SpikeActivityOrderRequest SO WITH(NOLOCK) ON O.UserID=SO.UserID

AND O.MobilePhone=SO.mobile AND DateDiff(d,CreateTime,getdate()) >= @SendIntervalDays --已发送短信时间隔大于7天  这句其实是不对的,后面那个条件完全是没有用的 这是一个思维问题,应该先把数据源去到,然后在去筛选,不是这边弄好了,那里弄好了,拼到一起的,大局观不咋好啊

WHERE O.Province in (310000,320000,330000)

AND O.DeliverySignDate >= @OrderDate

AND DateDiff(d,O.DeliverySignDate,getdate()) = @OrderIntervalDays --

Group by O.UserID

UNION  ALL

--秒杀订单

SELECT

O.UserID

,Max(O.OrderID) OrderID

,MAX(MobilePhone) Mobile

FROM View_SaleOrder O WITH(NOLOCK)

INNER JOIN OrderDiscountDetail OD (NOLOCK) ON O.OrderID=OD.OrderID

WHERE OD.SaleActivityRuleType = 10

AND  O.Province in (310000,320000,330000)

AND  O.DeliverySignDate >= @OrderDate --已签收

Group by O.UserID

--DECLARE @SendIntervalDays INT ,@OrderIntervalDays INT ,@OrderDate DATETIME

--SET @SendIntervalDays=30      --短信发送间隔天数

--SET @OrderIntervalDays=7    --订单已签收天数

--SET @OrderDate=‘2014-12-12‘  --订单时间

;WITH TEMP AS(

--秒杀订单

SELECT

O.UserID UserID

,Max(O.OrderID) OrderID

,MAX(MobilePhone) Mobile

FROM View_SaleOrder O WITH(NOLOCK)

INNER JOIN OrderDiscountDetail OD (NOLOCK) ON O.OrderID=OD.OrderID

WHERE  DateDiff(d,O.DeliverySignDate,getdate()) = 0  --当天签收

AND   O.CreationDate >= @OrderDate

AND   OD.SaleActivityRuleType = 10

AND   O.Province in (310000,320000,330000)

Group by O.UserID

UNION  ALL

--普通订单

SELECT

O.UserID UserID

,Max(O.OrderID) OrderID

,MAX(MobilePhone) Mobile

FROM  View_SaleOrder O WITH(NOLOCK)

WHERE DateDiff(d,O.DeliverySignDate,getdate()) = @OrderIntervalDays --订单已签收天数7天

AND O.CreationDate >= @OrderDate

AND O.Province in (310000,320000,330000)

Group by O.UserID )

--去可能重复userID

SELECT

TEMP.UserID UserID

,Max(TEMP.OrderID) OrderID

,MAX(TEMP.Mobile) Mobile

FROM TEMP

LEFT JOIN SpikeActivityOrderRequest SO WITH(NOLOCK) ON (TEMP.UserID=SO.UserID OR TEMP.mobile=SO.mobile)

WHERE (DateDiff(d,so.CreateTime,getdate()) >= @SendIntervalDays OR so.CreateTime IS NULL) --已发送短信时间隔大于30天  应当是所有的数据源拼装好了 在去筛选

GROUP BY TEMP.UserID

ORDER BY TEMP.UserID

多想想 多思考 多总结 多追究  深入研究  多注意性能,优先定位数据源 筛选数据源的

时间: 2024-10-10 04:45:29

sql server 的多表查询(left join )的相关文章

SQL Server中多表连接时驱动顺序对性能的影响

原文:SQL Server中多表连接时驱动顺序对性能的影响 本文出处:http://www.cnblogs.com/wy123/p/7106861.html (保留出处并非什么原创作品权利,本人拙作还远远达不到,仅仅是为了链接到原文,因为后续对可能存在的一些错误进行修正或补充,无他) 最近在SQL Server中多次遇到开发人员提交过来的有性能问题的SQL,其表面的原因是表之间去的驱动顺序造成的性能问题,具体表现在(已排除其他因素影响的情况下),存储过程偶发性的执行时间超出预期,甚至在调试的时候

SQL Server 索引和表体系结构(二)

原文:SQL Server 索引和表体系结构(二) 非聚集索引 概述 对于非聚集索引,涉及的信息要比聚集索引更多一些,由于整个篇幅比较大涉及接下来的要写的"包含列的索引","索引碎片"等一些知识点,可能要结合起来阅读理解起来要更容易一些.非聚集索引和聚集索引一样都是B-树结构,但是非聚集索引不改变数据的存储方式,所以一个表允许建多个非聚集索引:非聚集索引的叶层是由索引页而不是由数据页组成,索引行包含索引键值和指向表数据存储位置的行定位器, 既可以使用聚集索引来为表或

SQL Server 索引和表体系结构(非聚集索引)

原文:SQL Server 索引和表体系结构(非聚集索引) 非聚集索引 概述 对于非聚集索引,涉及的信息要比聚集索引更多一些,由于整个篇幅比较大涉及接下来的要写的“包含列的索引”,“索引碎片”等一些知识点,可能要结合起来阅读理解起来要更容易一些.非聚集索引和聚集索引一样都是B-树结构,但是非聚集索引不改变数据的存储方式,所以一个表允许建多个非聚集索引:非聚集索引的叶层是由索引页而不是由数据页组成,索引行包含索引键值和指向表数据存储位置的行定位器, 既可以使用聚集索引来为表或视图定义非聚集索引,也

Querying Microsoft SQL Server 2012 读书笔记:查询和管理XML数据 1 -使用FOR XML返回XML结果集

原文:Querying Microsoft SQL Server 2012 读书笔记:查询和管理XML数据 1 -使用FOR XML返回XML结果集 XML 介绍 <CustomersOrders> <Customer custid="1" companyname="Customer NRZBB"> <Order orderid="10692" orderdate="2007-10-03T00:00:00&

SQL Server 临时表 Vs 表变量

开始 说临时表和表变量,这是一个古老的话题,我们在网上也找到很多的资料阐述两者的特征,优点与缺点.这里我们在SQL Server 2005\SQL Server 2008版本上通过举例子,说明临时表和表变量两者的一些特征,让我们对临时表和表变量有进一步的认识.在本章中,我们将从下面几个方面去进行描述,对其中的一些特征举例子说明: 约束(Constraint) 索引(Index) I/0开销 作用域(scope) 存儲位置 其他 例子描述 约束(Constraint) 在临时表和表变量,都可以创建

Oracle\MS SQL Server Update多表关联更新

原文:Oracle\MS SQL Server Update多表关联更新 一条Update更新语句是不能更新多张表的,除非使用触发器隐含更新.而表的更新操作中,在很多情况下需要在表达式中引用要更新的表以外的数据.我们先来讨论根据其他表数据更新你要更新的表   一.MS    SQL    Server   多表关联更新      sql server提供了update的from 子句,可以将要更新的表与其它的数据源连接起来.虽然只能对一个表进行更新,但是通过将要更新的表与其它的数据源连接起来,就

C# 如何确定SQL Server 中数据表是否存在

SQL Server数据库的表名等信息属于架构集合的一部分,ADO.NET中的SqlConnection类包含的GetSchema 方法用于获取支持的架构集合列表,因此,要确定SQL Server 数据库中表是否存在是否存在,可通过SqlConnection.GetSchema("Tables")来获得,该方法返回一个DataTable,DataTable中包含table_catalog.table_schema.table_name.table_type等4列,table_name列

SQL Server 索引和表体系结构(三)

原文:SQL Server 索引和表体系结构(三) 包含列索引 概述 包含列索引也是非聚集索引,索引结构跟聚集索引结构是一样,有一点不同的地方就是包含列索引的非键列只存储在叶子节点:包含列索引的列分为键列和非键列,所谓的非键列就是INCLUDE中包含的列,至少需要有一个键列,且键列和非键列不允许重复,非键列最多允许1023列(也就是表的最多列-1),由于索引键列(不包括非键)必须遵守现有索引大小的限制(最大键列数为 16,总索引键大小为 900 字节)的要求所以引进了包含列索引. 正文 创建包含

在SQL Server 2016里使用查询存储进行性能调优

作为一个DBA,排除SQL Server问题是我们的职责之一,每个月都有很多人给我们带来各种不能解释却要解决的性能问题. 我就多次听到,以前的SQL Server的性能问题都还好且在正常范围内,但现在一切已经改变,SQL Server开始糟糕, 疯狂的事情不能解释.在这个情况下我介入,分析下整个SQL Server的安装,最后用一些神奇的调查方法找出性能问题的根源. 但很多时候问题的根源是一样的:所谓的计划回归(Plan Regression),即特定查询的执行计划已经改变.昨天SQL Serv