使用连接更新查询
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
条件可以移动;从逻辑上讲,它似乎属于 SELECT
的 WHERE
子句,或者可能属于将 n
连接到 rp
或 dnpm
的 ON
条件。优化器会将其移动到它提供最大性价比的位置,这可能会过滤 numplan
(又名 n
)table.
的扫描
我在使用连接更新数据库方面需要帮助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
条件可以移动;从逻辑上讲,它似乎属于 SELECT
的 WHERE
子句,或者可能属于将 n
连接到 rp
或 dnpm
的 ON
条件。优化器会将其移动到它提供最大性价比的位置,这可能会过滤 numplan
(又名 n
)table.