以前没有注意,总认为select * from a,b 实际上的意思就是查询a表和b表,这样查询和查询两次表a和b是一样的效果。
比如例子:
select b.DictVal+pa.AttaURL as src from HSProtAttachment pa,BDDict b where pa.ProtAttaID=20 and b.Type='FTPSet' and b.DictNo='FtpReadUrl'
(HSProtAttachment和BDDict 是没有任何关系的两个表。)
你可能没有察觉这里面有什么问题,并且一般也是没有太多问题的。
后来主管提醒这样写不好,会出问题之后,查询资料得知:
select * from a, b意思很简单,就是查询a、b里面所有的数据。如果后面有条件的话,意思就会变化,例如: select * from a,b wher a.id=b.aid此时的语句相当于 select * from a inner join on a.id=b.aid。这是一个sql语句写法的问题。
最好用 select * from a inner join b...或者select * from a union b...,根据具体需要而定。
这种写法可能只适合某种数据库,例如:sqlserser,但是如果放到别的数据库可能就不行了。 sql语句有标准,最好遵循sql92标准,这样以后换数据库的话,sql语句不会出错,这种写法是不符合规范的,要养成良好的习惯.
如果这里的a,b是有关联的,比如,b.aid就是a表中的id的话,这样实际上就是内连接来的,这样使用再SQLServer里面还可以使用!相当于select * from a inner join b on a.id=b.aid
但是,如果两个没有任何关联的两个表这样做了!
但是像上面一样:
select b.DictVal+pa.AttaURL as src from HSProtAttachment pa,BDDict b where pa.ProtAttaID=20 and b.Type='FTPSet' and b.DictNo='FtpReadUrl'
本来没有一点关系的两个表硬生生的给我弄成了是内连接的,内连接就是个笛卡尔积来着。这样是会出问题的。
应该改为:
select b.DictVal+(select pa.AttaName from HSProtAttachment pa where pa.ProtAttaID=24) as src from BDDict b where b.Type='FTPSet' and b.DictNo='FtpReadUrl'
总结:
select * from a,b 不可乱用。如果两个表没有关联千万不要使用。这样使用相当于内连接。如果是有关联的两个表,那最好使用inner join 或者 union 来代替。因为这种写法有些数据库是不支持的。
一句话,这种写法最好不用。