【问题标题】:Update with Inner join or subquery - multiple relations使用内部连接或子查询更新 - 多个关系
【发布时间】:2015-03-05 18:24:54
【问题描述】:

在另一个表的字段为空(EXP_Procimp)的情况下,我需要并更新表 exp_pedcom,但这两个表彼此之间没有直接关系,所以我实际上需要通过另外两个“路由”它表以便将它们关联起来。 “路由!关系有效,它按预期返回,但更新没有。我已经尝试使用 from 和作为子查询作为直接内部连接(这实际上更容易演示,所以这就是这里的内容。

UPDATE EXP_PEDCOM
SET STATUS_ATENDIMENTO=0
WHERE EXP_PROCIMP.DAT_RECEBIMENTO IS NOT NULL IN (SELECT EXP_PROCIMP.DAT_RECEBIMENTO
FROM 
EXP_PEDCOM INNER JOIN 
EXP_INVOICE_IT ON EXP_PEDCOM.NUM_PEDCOM = EXP_INVOICE_IT.NUM_PEDCOM INNER JOIN 
EXP_INVOICE ON EXP_INVOICE_IT.COD_DOCUMENTO = EXP_INVOICE.COD_DOCUMENTO INNER JOIN 
EXP_PROCIMP ON EXP_INVOICE.NUM_PROCIMP = EXP_PROCIMP.NUM_PROCIMP)

有什么建议吗?

【问题讨论】:

  • 请问是MSSQL还是MySQL...?

标签: sql-server subquery inner-join


【解决方案1】:

下面展示了如何使用UPDATE... FROM... 语法来使用它。 (在计算查询实际执行的操作时,我弄乱了格式和别名。)

UPDATE EXP_PEDCOM
 set STATUS_ATENDIMENTO = 0
 from EXP_PEDCOM
  inner join EXP_INVOICE_IT it
   on EXP_PEDCOM.NUM_PEDCOM = it.NUM_PEDCOM
  inner join EXP_INVOICE iv
   on it.COD_DOCUMENTO = iv.COD_DOCUMENTO
  inner join EXP_PROCIMP pr
   on iv.NUM_PROCIMP = pr.NUM_PROCIMP
 where pr.DAT_RECEBIMENTO is not null

这将起作用 [警告:我无法运行,因此调试可能的语法故障],但很难解释为什么/如何工作。这也有点不合常规。希望您会收到其他帖子,这些帖子显示了运行此类查询的“正确”方式。

【讨论】:

  • 打败了我。这应该按原样工作,但根据 OP 的原始声明需要注意两件事: 1. 虽然他们在查询中写了 not null,但他们说当它在问题中为 null 时,可能是查询不起作用的原因。 2. 如果第 1 点为真,这意味着某些值不会在应该更新的时候更新,因为可能需要外部连接。
  • 此外,此语法不适用于每个数据库后端,这就是为什么@T_G 在上面的 cmets 中询问您正在使用哪个数据库,此语法与数据库之间的语法非常不同。
  • 差不多就是这样。您应该更改的一件事是使用 EXP_PECOM 的别名。然后更新别名而不是基表。在某些情况下,当您不更新别名时,您可能会无意中更新查询之外的行。
  • 我根据查询中“...IS NOT NULL IN...”的部分做了“not null”,并错过了帖子开头的“is null”引用.正如@KHeaney 指出的那样:如果NOT NULL 是标准,那么where 子句将更改为is null,并且如果由于缺少一行而不是null 是有效标准,那么部分或全部连接将需要进行外部连接。
  • @HLGEM,当我发布我的答案和此评论时,“sql-server”标签出现了,我通过(鼠标悬停)标签描述:“Microsoft SQL Server 是一个关系数据库管理system..." 并假设他们使用的是 Microsoft 的 RDBMS。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-06
相关资源
最近更新 更多