最近在学习SQL语言,不得不说,数据库很强大,操作速度非常快,但语言实在是有些别扭,规范性差且语法不完善。怪不得它叫查询语句,不叫语言。整体学习下来,SQL语言是一个缝缝补补的结果,写起来非常不轻松。同时SQL server的帮助和语言操作能力很差,不利于编程。总之,非常快,非常有用,但非常不好用!
正好遇到这样一个问题,无数次试错后终于得到解决,用来说明以上观点。
有两个表,A和B,两表数据分别如下
表A 表B操作目的是将两表合并,得到表C,特点是以临时表#A、#B共有的Starting_Timestamp列为关键字进行合并,得到结果C
想得到的结果表C
参考博客http://bbs.csdn.net/topics/370140339得到的准确结果
正确的语法为
SELECT a.Starting_Timestamp, Un3_Avg, Uw3_Avg, RH3_Avg
FROM #A a
LEFT JOIN #B
ON a.Starting_timestamp = #B.Starting_timestamp
--或完整写法
SELECT e.Starting_Timestamp, Un3_Avg, Uw3_Avg, RH3_Avg
FROM #A
LEFT JOIN
(SELECT Starting_timestamp, RH3_Avg FROM #B)
ON #A.Starting_timestamp = #B.Starting_timestamp
关键点是在SELECT的变量描述中描述结果列出的所有记录名,使用LEFT JOIN连接两个表,而非如下检索语句。
SELECT * FROM #A e
LEFT JOIN
(SELECT RH3_Avg FROM #B) f
--这个方法主要问题出在此处的SELECT上,查询得到的新表并没有包含关键字字段
ON e.Starting_timestamp = Starting_timestamp
--但在此处这样一个本应该出错的未知字段因为语法的不严格,判断相等,被解析为赋值而结果出错
结果错误,共36行,是A和B的乘积
若没有在SELECT中描述准确的结果,则会有如下结果
SELECT *
FROM #A
LEFT JOIN #B
ON #A.Starting_timestamp = #B.Starting_timestamp
结果错误,timestamp列出现两次
网友评论