公司许多同事都遇到的问题,想不明白,到这里请教一下高手。

orablue 2003-12-28 09:59:21
1,*=
2,left join
都是左连接,很多资料上面描述它们是一个意思,但是我们在做一个多个表关联的时候,用左连接如果后面带where 那么,left join 和*= 得到的结果是不一样的。不知道为是什么,大家都不明白,请高手解释一下。谢谢。
...全文
40 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
overlookall 2003-12-30
  • 打赏
  • 举报
回复
*=/=*,我都没大用过啊, A left join B还好,就是你要想清楚连接的条件,一旦条件不清晰就会出现,数据错误的现象.
orablue 2003-12-29
  • 打赏
  • 举报
回复
update hthtxftb set shf=g.fy,psf=g.psf,df=f.feiyong,mqf=c.feiyong,txf=d.hj
from hthtxftb a
left join hthtfwtb b on a.xh=b.xh
left join htmqtb c on b.fhid=c.fhid
left join htdhtb d on b.fhid=d.fhid
left join htdbtb f on b.fhid=f.fhid
left join htshbtb g on b.fhid=g.fhid
这样用有问题吗?
binshan 2003-12-29
  • 打赏
  • 举报
回复
< old_outer_join >

使用不标准的产品专用语法和 WHERE 子句指定外联接。*= 运算符用于指定左外联接,=* 运算符用于指定右向外联接。

下例指定一个左向外联接,并在结果集内包含 Tab1 中不满足指定条件的行。

SELECT Tab1.name, Tab2.id
FROM Tab1, Tab2
WHERE Tab1.id *=Tab2.id


说明 这种语法具有潜在的二义性解释并且不标准,因此不提倡使用这种语法进行外联接。而应在 FROM 子句中指定联接。


可以通过在 FROM 子句中使用联接运算符,或通过在 WHERE 子句中使用不标准的 *= 和 =* 运算符来指定外联接。不能在同一语句中同时使用这两种方法。


playyuer 2003-12-29
  • 打赏
  • 举报
回复
*=可能出现岐义


(但确实实不是《ANSI/ISO SQL》标准)连接写法,以下各
题答案为了便于读者理解,一般不采用这种写法,这也是《ANSI/ISO SQL》标准所鼓
励的,JOIN 确实更容易地表达表之间的关系,有兴趣的读者可自行改写。如果使用
"*="实现两表以上的外连接时,要注意此时 WHERE 子句的 AND 条件是有顺序的,尽
管《ANSI/ISO SQL》标准不允许 WHERE 条件的顺序影响查询结果,但是 FROM 子句
的各表连接的顺序可以影响查询结果。
orablue 2003-12-29
  • 打赏
  • 举报
回复
alphall:真是我想知道的意思,谢谢。
AlphaII 2003-12-29
  • 打赏
  • 举报
回复
我知道楼主的意思,
A ,B表外连接查询时候( A left join B)如果
1.查询条件里头用where 写有导致表B结果为空的条件那么结果肯定空
2.但是条件里头用on 写有导致表B结果为空的条件那么结果不是空,只是B表字段为空
我的理解是 1.where 是产生连接后判断所以结果为空,
2.on 跟查询条件是在连接前就过滤,所以即使b表为空,a left join B(空表还是有结果)
victorycyz 2003-12-28
  • 打赏
  • 举报
回复
写成from tableA left join (tableB left join tableC on ...) on ...
怎么写呢?
-----------------------------------------------------------
刚才说过,left join 要特别注意顺序。象你上面写的select...恐怕会出语法错误。因为a表中的数据在你的where b.字段=...的条件下,无从取舍。要明确它们的关系才好写。下面的示例不一定符合你的原意。不过是给你一个参考:
select ...
from a left join
((select * from tableb t where t.col1='a') b
left join c on b.id=c.id
left join d on b.id=d.id
) on a.id=b.id
realgz 2003-12-28
  • 打赏
  • 举报
回复
select ....
from a
left join b on a.id=b.idno
left join c on b.idno=c.id
left join d on b.idno=d.id
left join e on b.idno=e.id
?
和 from tableA left join (tableB left join tableC on ...) on ...

恐怕通不过语法检查  多层的 outer join 不是由同一个表发起,而有扩展关系
orablue 2003-12-28
  • 打赏
  • 举报
回复
select ....
from a
left join b on a.id=b.idno
left join c on b.idno=c.id
left join d on b.idno=d.id
left join e on b.idno=e.id
where b.name='aaaaa'
类似这样的语句。
select ....
from a
left join b on a.id=b.idno
left join c on b.idno=c.id
left join d on b.idno=d.id
left join e on b.idno=e.id
where b.name='aaaaa'

写成from tableA left join (tableB left join tableC on ...) on ...
怎么写呢?
dlpseeyou 2003-12-28
  • 打赏
  • 举报
回复
有条件用:
select * from table a left join b on 条件 and 条件
victorycyz 2003-12-28
  • 打赏
  • 举报
回复
LEFT JOIN得到的结果是错误的。
-------------------------------
没有看到你的语句。不好说,至少,不是left join有什么不对。注意连接的顺序,如果不明白电脑会以什么顺序执行,最好加上括号,明确执行的顺序。例:
from tableA left join (tableB left join tableC on ...) on ...
realgz 2003-12-28
  • 打赏
  • 举报
回复
被 j9988(j9988) 先说了 ,但我 还是喜欢使用*=来进行外连接,关键是清晰,在 *=可能出现岐义的时候才写明join 。
j9988 2003-12-28
  • 打赏
  • 举报
回复
上面是联机丛书的。

所以尽量不要用"*=" 或"=*",

因为:
1.“该语法会导致有多种解释的不明确查询”
2."以后的 SQL Server 版本可能不再支持该语法。"
j9988 2003-12-28
  • 打赏
  • 举报
回复
Transact-SQL 联接
在早期的 Microsoft® SQL Server™ 2000 版本中,使用 *= 和 =* 在 WHERE 子句中指定左、右外部联接条件。有时,该语法会导致有多种解释的不明确查询。FROM 子句中指定遵从 SQL-92 的外部联接,不会导致上述不确定性。因为 SQL-92 语法更为精确,所以,本版中未包括有关在 WHERE 子句中使用旧的 Transact-SQL 外部联接语法的详细信息。以后的 SQL Server 版本可能不再支持该语法。任何使用 Transact-SQL 外部联接的语句都应改为使用 SQL-92 语法。

SQL-92 标准支持 FROM 或 WHERE 子句中的内部联接规范。WHERE 子句中指定的内部联接不会出现与 Transact-SQL 外部联接语法相同的不确定性问题。
hclopb 2003-12-28
  • 打赏
  • 举报
回复
up!
up!!
orablue 2003-12-28
  • 打赏
  • 举报
回复
我是把where 写在ON的后面,但是*=得到的结果是正确的LEFT JOIN得到的结果是错误的。不知道为什么?现在大家都用*=,不用LEFT JOIN,什么原因
xhwly 2003-12-28
  • 打赏
  • 举报
回复
推荐用left join
where 后面只写查询条件,而连接条件应写在on后面。

如:selec a.* from A left join B on A.id = B.id where A.id > 20
hglhyy 2003-12-28
  • 打赏
  • 举报
回复
同意,不支持用 *= 和 =*  

就像一个好的程序员不用 goto 一样!
Jianli2004 2003-12-28
  • 打赏
  • 举报
回复
地中海

22,298

社区成员

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

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