标题:请教一条简单的SQL SERVER里的查询语句问题
只看楼主
easyppt
Rank: 3Rank: 3
等 级:论坛游侠
威 望:1
帖 子:119
专家分:169
注 册:2021-11-24
结帖率:100%
 问题点数:0 回复次数:6 
请教一条简单的SQL SERVER里的查询语句问题
表t1/t2/t3 的内容如下(测试用,所以字段简单),关系就是  t1.fid = t2.fid  ,而t2 又和t3的关系是 t2.entryid=t3.entryid
Create Table [dbo].[t1]([fid] [int] Null,[a1] [char](10) Null) On [PRIMARY]
Create Table [dbo].[t2]([fid] [int] Null,[entryid] [int] Null,[a1] [nchar](10) Null) On [PRIMARY]
Create Table [dbo].[t3]([nid] [int] Null,[entryid] [int] Null,[a1] [char](10) Null) On [PRIMARY]

insert into t1(fid,a1) values(1,'a1')
insert into t1(fid,a1) values(2,'a1')
insert into t1(fid,a1) values(3,'a1')

insert into t2(fid,entryid,a1) values(1,1,'a1')
insert into t2(fid,entryid,a1) values(1,2,'a1')
insert into t2(fid,entryid,a1) values(1,3,'a1')
insert into t2(fid,entryid,a1) values(1,3,'a1')

insert into t3(nid,entryid,a1) values(1,3,'a1')
insert into t3(nid,entryid,a1) values(2,3,'a1')

我的问题下面的语句执行结果为什么是空,我希望的是只有t1表的全部记录,,因为 t1 是 left join t2的,而t2 和 t3 是INNER 无结果,应该不影响 t1吧? 所以结果应该只有t1的记录啊,为什么实际情况是无记录了,  inner 影响的 应该是直接关联的2个表啊,怎么还影响其他表呢?

select * from t1 left join t2 on t2.fid=t1.fid inner join t3 on t3.entryid=t2.entryid and t3.nid=999

麻烦大家帮忙解答一下,谢谢。

难道只能把 t2 和 t3 写成 子查询 再和 t1连接 ??
select * from t1 left join (select t2.fid,t2.entryid,t3.a1 from t2 inner join t3 on t3.entryid=t2.entryid and t3.nid=999) as mx on mx.fid=t1.fid



[此贴子已经被作者于2022-7-29 09:07编辑过]

搜索更多相关主题的帖子: join insert values Null into 
2022-07-29 09:01
mywisdom88
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:190
帖 子:3125
专家分:8340
注 册:2015-3-25
得分:0 
你想要什么结果
2022-07-29 09:14
easyppt
Rank: 3Rank: 3
等 级:论坛游侠
威 望:1
帖 子:119
专家分:169
注 册:2021-11-24
得分:0 
我要的最终结果,就是最后面写的语句结果。

前面百度了一下,重新温习了一下SQL语法,应该是我理解错了语句。 多连接的关系是  自上而下的,即: 第一个left 结果  再和 第二个inner连接,这样 最终结果肯定是无记录。
我错误理解为:inner 优先于 left  也就是  t2和 t3 先 处理  再和 t1 left ,而这种需求,只能用:
select * from t1 left join (select t2.fid,t2.entryid,t3.a1 from t2 inner join t3 on t3.entryid=t2.entryid and t3.nid=999) as mx on mx.fid=t1.fid

我的理解对吧? 但是子查询应该会影响效率的,还有其他更好的办法吗,最能不用子查询。
虽然 可以这样:select * from t2 inner join t3 on t3.entryid=t2.entryid and t3.nid=999 right join t1 on t1.fid=t2.fid
但是我的实际案例中 t1 需要放在前面,因为 还有其他很多表参与连接。


2022-07-29 09:26
mywisdom88
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:190
帖 子:3125
专家分:8340
注 册:2015-3-25
得分:0 
select * from t1 left join t2 on t2.fid=t1.fid inner join t3 on t3.entryid=t2.entryid and t3.nid=999

相当于
select * from t1 left join t2 on t2.fid=t1.fid
的结果,在和
inner join t3 on t3.entryid=t2.entryid and t3.nid=999

但由于你 and t3.nid=999 ,是没有记录的,所以你结果是没有记录



[此贴子已经被作者于2022-7-29 09:48编辑过]

2022-07-29 09:46
easyppt
Rank: 3Rank: 3
等 级:论坛游侠
威 望:1
帖 子:119
专家分:169
注 册:2021-11-24
得分:0 
版主说的对,SQL语句 是自上而下 依次处理的结果再和下面的语句 连接,而 inner 是最后有一条,不满足条件,所以结果是空。
2022-07-29 09:51
csyx
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:29
帖 子:484
专家分:1827
注 册:2018-3-13
得分:0 
这个子查询因为t3.nid=999的限制,因此查询应该很快,查询效率影响很小,唯一可改进的是 t3.nid=999 应该是过滤条件而非连接条件
。。。(
  select t2.fid, t2.entryid, t3.a1
  from t2
  inner join t3 on t3.entryid = t2.entryid
  where t3.nid = 999
) as mx 。。。


[此贴子已经被作者于2022-7-29 10:26编辑过]

2022-07-29 10:15
laowan001
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:54
帖 子:802
专家分:1914
注 册:2015-12-30
得分:0 
个人习惯,复杂的SQL可以逐步加工,中间结果保存到#tablename里,这样不容易出错,而且后期(过段时间后)好阅读、好维护
2022-07-30 17:52



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-509674-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.098137 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved