子查询与联接表是否有这样一个区别

一缕青烟 2011-07-25 08:49:20

select * from 人事表 left join 通讯表 on 人事表.工号=通讯表.工号


select *,(select 通讯地址 from 通讯表 where 工号=人事表.工号) from 人事表


当一个人有2个或2个以上的通讯地址时,子查询就不行了。是不是有这样一个规定:
子查询只能返回0条或1条相关数据供外部查询?
...全文
189 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
一缕青烟 2011-07-25
  • 打赏
  • 举报
回复
晕,显示不出来。
一缕青烟 2011-07-25
  • 打赏
  • 举报
回复
不好意思,是这个
一缕青烟 2011-07-25
  • 打赏
  • 举报
回复
不太清楚,能帮我解释下这个图吗?
gogodiy 2011-07-25
  • 打赏
  • 举报
回复
按期望值的数量可以分为标量子查询(单个值)和多值子查询(in/not in)。(就是子查询查询出的结果)
按子查询对外部查询的依赖性可以分为独立子查询和相关子查询。(就是子查询和外部查询有没有关系)
至于你第2条语句为什么只能取出一条值,1楼已经说的很清楚了。
一缕青烟 2011-07-25
  • 打赏
  • 举报
回复
我在执行计划里看到 嵌套循环left out join ,为什么不是当子查询有多条数据的时候,作一个联接呢?

再就是书下有这么一句: 使用连接从两个数据源中取回数据后,可以对其进行筛选和操纵。
如果必须在联接前对数据进行操纵,应使用子查询。

这句不是说名了子查询也会做一个联接吗?只是顺序不同, 这里的操纵又是什么意思?
oO寒枫Oo 2011-07-25
  • 打赏
  • 举报
回复
不过到底要什么样子的语句。
还是要看你要看你的结果什么样子的,根据需求写相应的查询语句。
os 2011-07-25
  • 打赏
  • 举报
回复
select *,(select min(通讯地址) from 通讯表 where 工号=人事表.工号) from 人事表
oO寒枫Oo 2011-07-25
  • 打赏
  • 举报
回复
[Quote=引用楼主 nonglizhi 的回复:]
SQL code

select * from 人事表 left join 通讯表 on 人事表.工号=通讯表.工号


select *,(select 通讯地址 from 通讯表 where 工号=人事表.工号) from 人事表



当一个人有2个或2个以上的通讯地址时,子查询就不行了。是不是有这样一个规定:
子查询只能返回0条或1条相关数据供外部查询?
[/Quote]
是的 要么返回null 要么返回一个值
生成的记录条数和 人事表的记录条数是一样多的
最后是你能够保证 人事表的工号 唯一对应通讯表的一个工号
不然这个语句会报错
要么改成left join
要么

select *,(select max(通讯地址) from 通讯表 where 工号=人事表.工号) from 人事表
AcHerat 元老 2011-07-25
  • 打赏
  • 举报
回复
你将子查询放在select后,是作为一个字段来取值的,如果有多条肯定出不来,要指定其中一条。

34,588

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧