关于left join

xiezonglin 2011-06-02 09:35:04
我在查一个表的时候,没用left join 记录数是对的,加了left join就多了很多重复的记录
去掉又正常了
left join不是以左表为准吗?怎么会使记录数增加?
...全文
160 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
Spade_J 2011-06-02
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 xiezonglin 的回复:]
引用 16 楼 spade_j 的回复:
select
字段,
字段,
(select top 1 字段 from b where a.字段=b.字段 order by 字段) as ...
...
from a

有点负责,我实际的查询还更复杂,甚至是连接好几个表,还有求和,难道就只有这种方式了?
[/Quote]
那用exists吧
select * from b where not exist(select 1 from b c where b.字段=c.字段 and ......)
上面的来代替b
xiezonglin 2011-06-02
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 spade_j 的回复:]
select
字段,
字段,
(select top 1 字段 from b where a.字段=b.字段 order by 字段) as ...
...
from a
[/Quote]
有点负责,我实际的查询还更复杂,甚至是连接好几个表,还有求和,难道就只有这种方式了?
Spade_J 2011-06-02
  • 打赏
  • 举报
回复
select
字段,
字段,
(select top 1 字段 from b where a.字段=b.字段 order by 字段) as ...
...
from a
xiezonglin 2011-06-02
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 cainlai 的回复:]
看你的描述,你可能应该用inner join
[/Quote]
试了,结果一样
xiezonglin 2011-06-02
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 spade_j 的回复:]
引用 8 楼 xiezonglin 的回复:
引用 4 楼 xyctc 的回复:
是以左为准,但要看数据及条件,出现左表对右表是一对多的情况,记录当然会增加

那怎样才能解决这个问题?就算左表对右边是一对多,但是我只要右边的第一条记录


查询时用
select top 1 * from b oder by 字段
来代替b
[/Quote]
问题是我要的是on的条件执行了以后的第一条记录,感觉不好弄阿
还有就是能不能这样,就是如果是一对多,那么我再增加一个条件,如果是一对一,那就不增加条件了
daishaodong 2011-06-02
  • 打赏
  • 举报
回复
left join的话,左表的全部记录会出来,右表如果没有对应左表的记录,会以null的形式出现。。
CainLai 2011-06-02
  • 打赏
  • 举报
回复
看你的描述,你可能应该用inner join
Spade_J 2011-06-02
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 xiezonglin 的回复:]
引用 4 楼 xyctc 的回复:
是以左为准,但要看数据及条件,出现左表对右表是一对多的情况,记录当然会增加

那怎样才能解决这个问题?就算左表对右边是一对多,但是我只要右边的第一条记录
[/Quote]

查询时用
select top 1 * from b oder by 字段
来代替b
chuanzhang5687 2011-06-02
  • 打赏
  • 举报
回复
那就不要left join
--小F-- 2011-06-02
  • 打赏
  • 举报
回复
除了一对一的以外,一对多也可以出现多的值

匹配左边的表
如果是这样
a

id col
1 a
2 b
3 c


b
id col
1 a
2 b
2 c
3 e
3 d
3 f

这样的话 就可能一对多
xiezonglin 2011-06-02
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 xyctc 的回复:]
是以左为准,但要看数据及条件,出现左表对右表是一对多的情况,记录当然会增加
[/Quote]
那怎样才能解决这个问题?就算左表对右边是一对多,但是我只要右边的第一条记录
Spade_J 2011-06-02
  • 打赏
  • 举报
回复
数量应该是
a*b - 条件过滤掉的数量 + 添加外部行的数量
xiaoxiangqing 2011-06-02
  • 打赏
  • 举报
回复
left join是以左表为主,意思是左表的数据都会出来,不管右表有没有与它匹配的记录
xiezonglin 2011-06-02
  • 打赏
  • 举报
回复
就是left jion后面的表on的条件使后面的表多个记录对应前面一个记录
Billy 2011-06-02
  • 打赏
  • 举报
回复
是以左为准,但要看数据及条件,出现左表对右表是一对多的情况,记录当然会增加
东那个升 2011-06-02
  • 打赏
  • 举报
回复
left join 是左表存在,右表不存在的记录也会查询出来
AcHerat 元老 2011-06-02
  • 打赏
  • 举报
回复
[Quote=引用楼主 xiezonglin 的回复:]
我在查一个表的时候,没用left join 记录数是对的,加了left join就多了很多重复的记录
去掉又正常了
left join不是以左表为准吗?怎么会使记录数增加?
[/Quote]

因为你右边表经过连接条件对应出来的记录数是多条,所以结果便会有多条。

例如 a 表 id

id
---
1

b 表 id aid

id------aid
------------
1 ------ 1
2 ------ 1

select *
from a left join b on a.id = b.aid

结果集记录数便是b表的记录数!
hanger1212 2011-06-02
  • 打赏
  • 举报
回复
right join 呗

34,587

社区成员

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

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