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

来源:互联网 发布:kali重启网络命令 编辑:程序博客网 时间:2024/06/06 05:58

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);


 

原创粉丝点击