使用连接更新查询

update query using join

我在使用连接更新数据库方面需要帮助query.It 这不是一个直接的查询,有点令人困惑。

我创建了一个 select 查询 select routelist(d.name) 等于 'TP-424-RL'.

select n.dnorpattern as RoutePattern, 
rp.name as Partition, 
d.name as RouteList,
rl.selectionOrder,
rg.name as RouteGroup 
from numplan as n 
inner  join routepartition as rp 
  on  rp.pkid=n.fkroutepartition 
inner join devicenumplanmap as dnpm 
  on dnpm.fknumplan=n.pkid 
inner join device as d 
  on dnpm.fkdevice=d.pkid 
inner join routelist as rl 
  on rl.fkdevice = d.pkid 
inner join routegroup as rg 
  on rg.pkid=rl.fkroutegroup and n.tkpatternusage=5 
where  d.name='TP-424-RL';

同样我想更新路由列表(d.name='SME-IT')而不是'TP-424-RL'。 d.name(name from device table 不直接给出路由列表,但是通过联合查询的组合给出了 d.name =routelist)

我试过了,没用。

update (
select n.dnorpattern as RoutePattern, 
rp.name as Partition, 
d.name as RouteList , 
rl.selectionOrder, 
rg.name as RouteGroup 
from numplan as n 
inner join routepartition as rp 
  on  rp.pkid=n.fkroutepartition 
inner join devicenumplanmap as dnpm 
  on dnpm.fknumplan=n.pkid 
inner join device as d 
  on dnpm.fkdevice=d.pkid 
inner join routelist as rl 
  on rl.fkdevice = d.pkid 
inner join routegroup as rg 
  on rg.pkid=rl.fkroutegroup and n.tkpatternusage=5 
where d.name='TP-424-RL') set device.name='CME-IT' where device.name='TP-424-RL';

有人可以帮我解决这个问题吗?

您需要在大括号内加入替换值。如果您的查询满足 'updatable' table 的要求,您将能够使用两列

进行更新

这将不起作用,因为您的查询中没有 device.name。 而且,对我来说它看起来很奇怪。
我可能会这样做:(将与 sql 服务器一起工作,我不知道你的 rdbms,所以我使用我最了解的)

update device
set name = 'CME-IT'
from numplan as n 
inner join routepartition as rp on  rp.pkid=n.fkroutepartition 
inner join devicenumplanmap as dnpm on dnpm.fknumplan=n.pkid 
inner join device as on dnpm.fkdevice = device.pkid 
inner join routelist as rl on rl.fkdevice = device.pkid 
inner join routegroup as rg on rg.pkid=rl.fkroutegroup and n.tkpatternusage=5 
where device.name='TP-424-RL'

检查 Informix 中 UPDATE 语句的语法。未描述连接符号更新,这就是为什么您在尝试使用它时会出错。

您将需要使用一般形式的 UPDATE 语句:

UPDATE device
   SET name = 'SME-IT' -- Or did you mean CME-IT?  The question says both
 WHERE pkid IN (SELECT ...)

并且 ... 部分将是一个查询,用于标识设备 table 中当前设备名称为 TP-424-RL 并且应该更新行。 (我假设它不像“应该更新设备名称为 TP-424-RL 的所有行那样简单。)

一个简单的版本可能是:

UPDATE device
   SET name = 'SME-IT' -- Or did you mean CME-IT?  The question says both
 WHERE pkid IN
      (SELECT d.pkid
        FROM numplan AS n 
        JOIN routepartition AS rp 
          ON rp.pkid = n.fkroutepartition 
        JOIN devicenumplanmap AS dnpm 
          ON dnpm.fknumplan = n.pkid 
        JOIN device AS d
          ON dnpm.fkdevice = d.pkid 
        JOIN routelist AS rl 
          ON rl.fkdevice = d.pkid 
        JOIN routegroup AS rg 
          ON rg.pkid = rl.fkroutegroup AND n.tkpatternusage = 5 
       WHERE d.name='TP-424-RL'
      )

我怀疑可以简化查询,但我不确定您的架构的所有细节。 AND n.tkpatternusage = 5 条件可以移动;从逻辑上讲,它似乎属于 SELECTWHERE 子句,或者可能属于将 n 连接到 rpdnpmON 条件。优化器会将其移动到它提供最大性价比的位置,这可能会过滤 numplan(又名 n)table.

的扫描