一个简单的UPDATE语句,就是执行不了,奇怪了。

zhangweitaylor 2016-12-14 01:29:55
直接贴脚本:
CREATE TABLE [dbo].[org_dep1](
[ID] [varchar](32) NOT NULL,
[sCode] [varchar](200) NULL,
[sName] [varchar](200) NULL,
[idEmployee] [varchar](32) NULL,
[sMemo] [varchar](2000) NULL,
[Created] [datetime] NULL,
[CreatedBy] [varchar](32) NULL,
[Updated] [datetime] NULL,
[UpdatedBy] [varchar](32) NULL,
[pathid] [varchar](3300) NULL,
[idparent] [varchar](32) NULL,
[bfail] [int] NULL
) ON [PRIMARY]
GO
SET ANSI_PADDING OFF
GO
INSERT [dbo].[org_dep1] ([ID], [sCode], [sName], [idEmployee], [sMemo], [Created], [CreatedBy], [Updated], [UpdatedBy], [pathid], [idparent], [bfail]) VALUES (N'40C6011581E24F91A3B26310EA867BEB', N'subcomp19', N'重庆**', N'subcomp9', N'重庆**有限公司', NULL, NULL, NULL, NULL, N'9', N'subcomp9', 0)
INSERT [dbo].[org_dep1] ([ID], [sCode], [sName], [idEmployee], [sMemo], [Created], [CreatedBy], [Updated], [UpdatedBy], [pathid], [idparent], [bfail]) VALUES (N'6F6E55C2B2C84240B482D58E0B680170', N'subcomp9', N'通关事业部', N'subcomp1', N'通关事业部', NULL, NULL, NULL, NULL, N'1', N'subcomp1', 0)

问题是执行下面的SQL语句,很简单的更新,但是就是执行不了。

update [org_dep1] set [idparent]=a.id from [org_dep1] a where idparent=a.sCode
更新记录数是0,idparent没有更新,实在想不明白原因。谢谢。

...全文
285 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
Tiger_Zhao 2016-12-14
  • 打赏
  • 举报
回复
看帮助的 FROM <table_source> 部分,写得很清楚:
(对比写完整的语句)在 FROM 里面只出现一次时可以省略啊。
  • 打赏
  • 举报
回复
引用 5 楼 Tiger_Zhao 的回复:
应该反过来说,首先 from 后面两个表实现了父子联接;然后 UPDATE 需要指明是更新父表还是子表。
但是 像这种 UPDATE A SET NN=B.DD FROM B WHERE ID=B.PP 时不需要在from 后跟上 a表
Tiger_Zhao 2016-12-14
  • 打赏
  • 举报
回复
应该反过来说,首先 from 后面两个表实现了父子联接;然后 UPDATE 需要指明是更新父表还是子表。
  • 打赏
  • 举报
回复
把 UPDATE 语句变为 SELECT 语句有助于理解

SELECT c.*,
           p.id
      from #org_dep1 c
      JOIN #org_dep1 p
        ON c.idparent = p.sCode
     --   这俩个等价的
 SELECT #org_dep1.*,A.ID FROM #org_dep1,#org_dep1 AS A  where #org_dep1.idparent=a.sCode
 
 update #org_dep1  set #org_dep1.[idparent]=a.id  from  #org_dep1,#org_dep1 AS a where #org_dep1.idparent=a.sCode 
  -- 这样写也是等价于下面的
  update c
      set c.idparent = p.id
      from #org_dep1 c
	  JOIN #org_dep1 p
      ON c.idparent = p.sCode
/
ID	sCode	sName	idEmployee	sMemo	Created	CreatedBy	Updated	UpdatedBy	pathid	idparent	bfail
40C6011581E24F91A3B26310EA867BEB	subcomp19	重庆**	subcomp9	重庆**有限公司	NULL	NULL	NULL	NULL	9	6F6E55C2B2C84240B482D58E0B680170	0
6F6E55C2B2C84240B482D58E0B680170	subcomp9	通关事业部	subcomp1	通关事业部	NULL	NULL	NULL	NULL	1	subcomp1	0
/

但是 我不懂 为什么
update #org_dep1  set #org_dep1.[idparent]=a.id  from  #org_dep1,#org_dep1 AS a where #org_dep1.idparent=a.sCode 
这句可以  ,而且要在from 后面加 update的那张表
Tiger_Zhao 2016-12-14
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 baidu_36457652 的回复:]为什么 update 后 第二条数据的idparent 会变?[/Quote]
想要不变,LEFT JOIN 改为JOIN
把 UPDATE 语句变为 SELECT 语句有助于理解
    SELECT c.*,
p.id
from #org_dep1 c
LEFT JOIN #org_dep1 p
ON c.idparent = p.sCode

SELECT c.*,
p.id
from #org_dep1 c
JOIN #org_dep1 p
ON c.idparent = p.sCode

  • 打赏
  • 举报
回复
引用 1 楼 Tiger_Zhao 的回复:
同一个表,有父子关系就要用两表联接
    update c
       set c.idparent = p.id
      from org_dep1 c
 LEFT JOIN org_dep1 p
        ON c.idparent = p.sCode

CREATE TABLE #org_dep1(
[ID] [varchar](32) NOT NULL,
[sCode] [varchar](200) NULL,
[sName] [varchar](200) NULL,
[idEmployee] [varchar](32) NULL,
[sMemo] [varchar](2000) NULL,
[Created] [datetime] NULL,
[CreatedBy] [varchar](32) NULL,
[Updated] [datetime] NULL,
[UpdatedBy] [varchar](32) NULL,
[pathid] [varchar](3300) NULL,
[idparent] [varchar](32) NULL,
[bfail] [int] NULL
) ON [PRIMARY]
GO
SET ANSI_PADDING OFF
GO
INSERT #org_dep1 ([ID], [sCode], [sName], [idEmployee], [sMemo], [Created], [CreatedBy], [Updated], [UpdatedBy], [pathid], [idparent], [bfail]) VALUES (N'40C6011581E24F91A3B26310EA867BEB', N'subcomp19', N'重庆**', N'subcomp9', N'重庆**有限公司', NULL, NULL, NULL, NULL, N'9', N'subcomp9', 0)
INSERT #org_dep1 ([ID], [sCode], [sName], [idEmployee], [sMemo], [Created], [CreatedBy], [Updated], [UpdatedBy], [pathid], [idparent], [bfail]) VALUES (N'6F6E55C2B2C84240B482D58E0B680170', N'subcomp9', N'通关事业部', N'subcomp1', N'通关事业部', NULL, NULL, NULL, NULL, N'1', N'subcomp1', 0)
--DELETE FROM #org_dep1
--SELECT * FROM #org_dep1
--update #org_dep1  set #org_dep1.[idparent]=a.id  from #org_dep1 AS a where idparent=a.sCode
SELECT * FROM #org_dep1,#org_dep1 AS A  where #org_dep1.idparent=a.sCode--查询 idparent=a.sCode 只有一条数据

 update c
       set c.idparent = p.id
      from #org_dep1 c
 LEFT JOIN #org_dep1 p
        ON c.idparent = p.sCode
为什么 update 后 第二条数据的idparent  会变?
/*
ID	sCode	sName	idEmployee	sMemo	Created	CreatedBy	Updated	UpdatedBy	pathid	idparent	bfail
40C6011581E24F91A3B26310EA867BEB	subcomp19	重庆**	subcomp9	重庆**有限公司	NULL	NULL	NULL	NULL	9	6F6E55C2B2C84240B482D58E0B680170	0
6F6E55C2B2C84240B482D58E0B680170	subcomp9	通关事业部	subcomp1	通关事业部	NULL	NULL	NULL	NULL	1	NULL	0
*/
Tiger_Zhao 2016-12-14
  • 打赏
  • 举报
回复
同一个表,有父子关系就要用两表联接
    update c
set c.idparent = p.id
from org_dep1 c
LEFT JOIN org_dep1 p
ON c.idparent = p.sCode

34,594

社区成员

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

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