为何COALESCE不起作用?

ttyp 2004-09-08 10:40:58
CREATE TABLE #T(a INT,b INT)
CREATE TABLE #TT(a INT,b INT)

INSERT INTO #T VALUES(1,1)
INSERT INTO #T VALUES(2,1)

INSERT INTO #TT VALUES(1,1)
INSERT INTO #TT VALUES(1,2)

SELECT * FROM #T,#TT WHERE #T.A *=#TT.A AND COALESCE(#TT.B,0) - #T.B>0

DROP TABLE #T
DROP TABLE #TT

--结果应该只有一条的
...全文
795 6 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
ttyp 2004-09-08
  • 打赏
  • 举报
回复
倒,我就是要左连接up
liuxiang_csdn 2004-09-08
  • 打赏
  • 举报
回复
SELECT * FROM #T,#TT WHERE #T.A =#TT.A AND COALESCE(#TT.B,0) - #T.B>0
ttyp 2004-09-08
  • 打赏
  • 举报
回复
谢谢楼上各位, cxingh(游牧民族),pbsql(风云) 正解
cxingh 2004-09-08
  • 打赏
  • 举报
回复
改为:
SELECT * FROM #T left join #TT on #T.A=#TT.A
WHERE COALESCE(#TT.B,0) - #T.B>0

有两点说明:
1.这是三值逻辑的原因, 不是COALESCE的原因, 在用你的语句查询出的NULL值不是#TT中的值, 而是因为左链接产生的NULL值.
2.*= 左链接和left JOin 的区别: 前着是先将所有的WHERE条件对相关table筛选后再链接, 而后着是先左链接后再对链接的结果进行where 条件筛选!
pbsql 2004-09-08
  • 打赏
  • 举报
回复
帮助上说:有时,该语法会导致有多种解释的不明确查询。

所以建议不要用=*、*=这样的写法
pbsql 2004-09-08
  • 打赏
  • 举报
回复
SELECT * FROM #T left join #TT on #T.A=#TT.A where isnull(#TT.B,0) - #T.B>0

34,838

社区成员

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

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