我犯过的SQL语句错误(不断更新中……)

1.建临时表

create table #temp (Cyear int, Cmonth int ,Cscore double)


错误信息:

消息 102,级别 15,状态 1,第 1 行
')' 附近有语法错误。

 

错误原因:没有 double型啊!还是说double型有别的意思所以被识别出来了?这个留待研究,反正,正确代码是:

create table #temp (Cyear int, Cmonth int ,Cscore float)


 2.跨数据库连接多张表。

问题描述:有A,B两个数据库,将数据库A中的表a,表b,表c跟数据库B中的表d进行等值连接(表d里面含有跟表a,表b,表c相同的列),并且表a还跟自己做了一次自连接。

然后郁闷的事情出现了,

执行完语句,影响行数为190行。

在where语句里面加了一个限制之后(这个限制本来加跟不加都不影响结果的),再执行sql语句,影响行数变成了200行!(正常情况下增加where语句的限制,影响行数不减少也不至于增加吧……?)

并且,执行(加限制过的sql语句)except(没有加限制过的sql语句),影响行数为0行。

后来改写了SQL语句,让数据库A里面的表先完成各种自连接呀等值连接之类的,得到的查询结果再跟数据库B的表d进行连接,就没有问题了。

结论:跨数据库连接很多张表的时候,尽量将在同一个数据库里面的表放在一起处理,再连接这些处理过的结果进行再处理。

 

3.union 与 union all

问题描述:执行ex1.sql的select语句,选出了100行数据。

           执行ex2.sql的select语句,选出了200行数据。

然后我将ex1.sql的语句跟ex2.sql的语句放在了一起,用union拼起来,执行之后,只选出了280行的数据,中间损失的20行数据去哪里了呢?

调查了一下发现ex1.sql筛选出来的数据跟ex2.sql筛选出来的数据相同的时候,有些数据就被“消失”了。

将union 改成 union all,就没有问题了。

结论:以后遇到要将很多的select语句的结果拼起来的时候,一定要用union all而不是union啊~

 

4.做到日期,时间的增减之类的,要用dateadd函数。

例如:求明天的日期。

不好的例子:

select getdate()+1


正确的例子:

 

select dateadd(dd,1,getdate())

 

5.使用到关于星期的判断的时候,要看看系统的语言设置。

具体参考:http://blog.csdn.net/zhuoruling/article/details/5028309

自己觉得常用的一些关于星期的写法

--查看当前使用的语言
--select @@language
--设置语言为中文(原来全局变量的设置是这样的啊)
--set language '简体中文'
--设置星期五为一周开始的第一天
--set datefirst 5

--查看一周开始的第一天
select @@datefirst
--查看今天是一周的第几天
select datepart(dw,getdate())
--查看今天星期几
select datename(dw,getdate())
--削除datefirst的影响,让一个星期都从星期七开始,
--也就是,星期七为1,星期一为2这样子......
--ps.最后注意一下cast的写法......
select datepart(dw,cast ('20120305' as datetime) + @@datefirst);


 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值