您的位置:首页 > 数据库

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

2012-02-28 21:55 260 查看
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.使用到关于星期的判断的时候,要看看系统的语言设置。

具体参考:/article/11094915.html

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

--查看当前使用的语言
--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);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: