一条开发人员的sql的疑问?

oraclemch 2010-03-17 11:22:34
select 
count(publicinst2_ .id)
from BENEFIT_SERVICE benefitser0_
right outer join INSTI_BENEFIT_SERVICE publicinst1_ on benefitser0_.ID=publicinst1_.BENEFIT_SERVICE_ID
right outer join INSTITUTION publicinst2_ on publicinst1_.INSTI_ID=publicinst2_.ID
where ( benefitser0_.STATUS>-9) and publicinst2_.AREA_ID=295 and publicinst2_.STATUS=1 --order by benefitser0_.POST_TIME desc;


上面的sql是我们一个开发人员写的hql语句生成的sql语句。
看的是右外连接,他说这个查询语句主表是INSTI_BENEFIT_SERVICE ,而且后面为on能保证唯一条件。

说道这里我就有疑问了,右外连接是主表为主,而且on条件不起作用的,就是只要是INSTI_BENEFIT_SERVICE 表有的数据,那么就可以显示吧,所以我觉得这条sql有问题的,大家说呢?
...全文
144 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
东那个升 2010-03-17
  • 打赏
  • 举报
回复
只是count一个表满足条件的数据。

上回谁谁说的查询单表数据连接的没EXISTS好。
oraclemch 2010-03-17
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 fredrickhu 的回复:]
SQL code
select
count(publicinst2_ .id)
from
BENEFIT_SERVICE benefitser0_
right outer join
INSTI_BENEFIT_SERVICE publicinst1_ ---你这个命名到是很奇怪 其他的没什么问题
on
benefitser0_.ID=publicinst1_.BENE……
[/Quote]

程序里面是hql语句,然后控制台自动转换的sql就是这样的。
--小F-- 2010-03-17
  • 打赏
  • 举报
回复
select 
count(publicinst2_ .id)
from
BENEFIT_SERVICE benefitser0_
right outer join
INSTI_BENEFIT_SERVICE publicinst1_ ---你这个命名到是很奇怪 其他的没什么问题
on
benefitser0_.ID=publicinst1_.BENEFIT_SERVICE_ID
right outer join
INSTITUTION publicinst2_
on
publicinst1_.INSTI_ID=publicinst2_.ID
where
( benefitser0_.STATUS>-9) and publicinst2_.AREA_ID=295 and publicinst2_.STATUS=1 --order by benefitser0_.POST_TIME desc;
--小F-- 2010-03-17
  • 打赏
  • 举报
回复
select 
count(publicinst2_ .id)
from
BENEFIT_SERVICE benefitser0_
right outer join
INSTI_BENEFIT_SERVICE publicinst1_ ---你这个命名到是很奇怪 其他的没什么问题
on
benefitser0_.ID=publicinst1_.BENEFIT_SERVICE_ID
right outer join
INSTITUTION publicinst2_
on
publicinst1_.INSTI_ID=publicinst2_.ID
where
( benefitser0_.STATUS>-9) and publicinst2_.AREA_ID=295 and publicinst2_.STATUS=1 --order by
benefitser0_.POST_TIME desc;
vivai2010 2010-03-17
  • 打赏
  • 举报
回复
on 连接条件
where 限制条件
dawugui 2010-03-17
  • 打赏
  • 举报
回复
on 是连接条件.

where后的是限制条件.

有何不妥?

或者,你提供数据,看结果是否正确?
-狙击手- 2010-03-17
  • 打赏
  • 举报
回复
而且on条件不起作用的
---
为什么呀

INSTITUTION 还有这个表呢?

如果这样把INSTI_BENEFIT_SERVICE 放from后,用left
dawugui 2010-03-17
  • 打赏
  • 举报
回复
on 是连接条件.

where后的是限制条件.

又何不妥.

或者,你提供数据,看结果是否正确?
feegle_develop 2010-03-17
  • 打赏
  • 举报
回复
我觉得没啥问题....
misterliwei 2010-03-17
  • 打赏
  • 举报
回复

select count(publicinst2_ .id)
from BENEFIT_SERVICE benefitser0_
right outer join INSTI_BENEFIT_SERVICE publicinst1_ on
benefitser0_.ID=publicinst1_.BENEFIT_SERVICE_ID
right outer join INSTITUTION publicinst2_ on publicinst1_.INSTI_ID=publicinst2_.ID where ( benefitser0_.STATUS>-9) and publicinst2_.AREA_ID=295 and publicinst2_.STATUS=1 --order by benefitser0_.POST_TIME desc;


第一个right outer join 确实是在执行完ON条件后将INSTI_BENEFIT_SERVICE的不满足条件的数据补上了。
但是第二个right outer join 却是对上面的数据再过滤,此时就有可能将INSTI_BENEFIT_SERVICE的一些数据过滤掉了,而ON条件后补上的数据是INSTITUTION表的数据。

永生天地 2010-03-17
  • 打赏
  • 举报
回复
似乎在某种情况下,sqlserver 的where和 on同时用时on不起作用。

忘了什么情况了
oraclemch 2010-03-17
  • 打赏
  • 举报
回复
问下,这些连续的right outer on中,根据什么判断哪个表式主表呢?
oraclemch 2010-03-17
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 robinson_0612 的回复:]
这个没有什么问题,不是on 不起作用。
对于BENEFIT_SERVICE,INSTI_BENEFIT_SERVICE表中的记录,用下面的ID来关联,
on benefitser0_.ID=publicinst1_.BENEFIT_SERVICE_ID

当INSTI_BENEFIT_SERVICE中有ID,但BENEFIT_SERVICE表中不存在时也会返回一条数据。
举个列子更好理解……
[/Quote]

问下,这些连续的right outer on中,根据什么判断哪个表式主表呢?
清风智语 2010-03-17
  • 打赏
  • 举报
回复
这个没有什么问题,不是on 不起作用。
对于BENEFIT_SERVICE,INSTI_BENEFIT_SERVICE表中的记录,用下面的ID来关联,
on benefitser0_.ID=publicinst1_.BENEFIT_SERVICE_ID

当INSTI_BENEFIT_SERVICE中有ID,但BENEFIT_SERVICE表中不存在时也会返回一条数据。
举个列子更好理解:

IF OBJECT_ID('dbo.ta') IS NOT NULL
DROP TABLE ta ;
IF OBJECT_ID('dbo.tb') IS NOT NULL
DROP TABLE tb ;
CREATE TABLE ta
(
Keya VARCHAR(5),
Cola VARCHAR(10)
)
CREATE TABLE tb
(
Keyb VARCHAR(5),
Colb VARCHAR(10)
)
INSERT INTO ta SELECT '10','Aa'
UNION ALL SELECT '11','Ab'
UNION ALL SELECT '12','Ac'
UNION ALL SELECT '9','Ae'

INSERT INTO tb SELECT '10','Ba'
UNION ALL SELECT '11','Bb'
UNION ALL SELECT '13','Bc'
UNION ALL SELECT '14','Bd'

SELECT ta.*,tb.*
FROM ta
RIGHT OUTER JOIN tb
ON ta.Keya = tb.Keyb

Keya Cola Keyb Colb
----- ---------- ----- ----------
10 Aa 10 Ba
11 Ab 11 Bb
NULL NULL 13 Bc
NULL NULL 14 Bd


-- tb 中有多出的Keyb 13 , 14 因为我们使用了right outer join 故tb中的为保留表,ta中没有对应的记录,这样用NULL来代替。keya 为9的则不符合on条件,故没有列出。

22,298

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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