注册 登录
编程论坛 VFP论坛

请教一条简单的SQL SERVER里的查询语句问题

easyppt 发布于 2022-07-29 09:01, 1164 次点击
表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编辑过]

6 回复
#2
mywisdom882022-07-29 09:14
你想要什么结果
#3
easyppt2022-07-29 09:26
我要的最终结果,就是最后面写的语句结果。

前面百度了一下,重新温习了一下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 需要放在前面,因为 还有其他很多表参与连接。


#4
mywisdom882022-07-29 09:46
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编辑过]

#5
easyppt2022-07-29 09:51
版主说的对,SQL语句 是自上而下 依次处理的结果再和下面的语句 连接,而 inner 是最后有一条,不满足条件,所以结果是空。
#6
csyx2022-07-29 10:15
这个子查询因为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编辑过]

#7
laowan0012022-07-30 17:52
个人习惯,复杂的SQL可以逐步加工,中间结果保存到#tablename里,这样不容易出错,而且后期(过段时间后)好阅读、好维护
1