select * from a,b用法

以前没有注意,总认为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 来代替。因为这种写法有些数据库是不支持的。

一句话,这种写法最好不用。

转载原文链接:https://blog.csdn.net/zhbitxhd/article/details/11969739

  • 4
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值