2012-07-31:
每次写完存储过程或一些SQL语句,老同事一眼就能看出问题所在,还是咱不认真造成的。今日记下以防后面范同样的错误。
1. 定义新的数据列,确定其数据类型,以免程式中计算错误。
创建总金额栏位,cast(SUM(A.iQty*isnull(A.dPrice,0)) as decimal(18,2)) AMT ,之前未设定AMT的小数点栏位。在个别DB设计者有时会将数量或单价设置为real 类型。在SQLServer中 real类型的数据通过公式计算,小数点位数是不定长的。
2.在 FROM 子句中指定外联接时,可以由下列几组关键字中的一组指定:
LEFT JOIN 或 LEFT OUTER JOIN。 左向外联接的结果集包括 LEFT OUTER 子句中指定的左表的所有行,而不仅仅是联接列所匹配的行。如果左表的某行在右表中没有匹配行,则在相关联的结果集行中右表的所有选择列表列均为空值。
RIGHT JOIN 或 RIGHT OUTER JOIN。
右向外联接是左向外联接的反向联接。将返回右表的所有行。如果右表的某行在左表中没有匹配行,则将为左表返回空值。
FULL JOIN 或 FULL OUTER JOIN。 完整外部联接返回左表和右表中的所有行。当某行在另一个表中没有匹配行时,则另一个表的选择列表列包含空值。如果表之间有匹配行,则整个结果集行包含基表的数据值。
交叉联接。
交叉联接返回左表中的所有行,左表中的每一行与右表中的所有行组合。交叉联接也称作笛卡尔积。
eg1: Join
select * from T_Tab A join T_Tabs B on A.iBID=B.iD
显示内容为:A表与B表中符合A.iBID=B.iD的数据信息,若无信息,则为整个数据集为空
eg2:Left Join or Lefter outer Join
select * from T_Tab A left joinT_Tabs Bon A.iBID=B.iD
显示内容为:A表所有的数据信息+符合A.iBID=B.iD的数据信息。若没有A.iBID=B.iD的数据,则显示出A表数据+B表(NULL)的数据信息。
3.INNER JOIN 运算
组合两个或多个表中的记录,只要在公共字段之中有相符的值。
多表联接建立记录集是十分有用的,因为某些情况下,我们需要把数字数据类型显示为相应的文本名称,这就碰到了多表联接建立记录集的问题。
注重事项:
●在输入字母过程中,一定要用英文半角标点符号,单词之间留一半角空格;
●在建立数据表时,假如一个表与多个表联接,那么这一个表中的字段必须是“数字”数据类型,而多个表中的相同字段必须是主键,而且是“自动编号”数据类型。否则,很难联接成功。
●代码嵌套快速方法:如,想连接五个表,则只要在连接四个表的代码上加一个前后括号(前括号加在FROM的后面,后括号加在代码的末尾即可),然后在后括号后面继续添加“INNERJOIN表名XON表1.字段号=表X.字段号”代码即可,这样就可以无限联接数据表了:)
语法格式:
其实INNERJOIN……ON的语法格式可以概括为:
FROM((( 表1 INNER JOIN 表2 ON表1.字段号=表2.字段号) INNER JOIN 表3 ON 表1.字段号=表3.字段号) INNER JOIN表4 ON Member.字段号=表4.字段号) INNER JOIN表X ON Member.字段号=表X.字段号