【发布时间】:2026-01-12 22:50:01
【问题描述】:
我有这个返回简单表的选择查询 - 见下文。
我花了一整天的时间试图写一个更新语句,当 EQLOC 为 NULL 或与 HOOKNO 不同时,它应该用 HOOKNO 更新......但我失败了。
请帮忙。
SELECT ho.HOOK_OFFICE_LETTER || LPAD(khc.HOOK_NO, 5, '0') as hookno, eq.location_description as eqloc
FROM KEY_HOOK_CURRENT khc
INNER JOIN KEY_HOLDING kho ON khc.KEY_HOLDINGOID = kho.KEY_HOLDINGOID
INNER JOIN CONTRACT con ON kho.CUSTOMEROID = con.CUSTOMEROID
INNER JOIN VW_CURRENT_CONTRACT_PERIOD ccp ON con.CONTRACT_ID = ccp.CONTRACT_ID
INNER JOIN CONTRACT_PERIOD cp ON (ccp.CONTRACT_ID = cp.CONTRACT_ID AND ccp.CONTRACT_PERIOD = cp.CONTRACT_PERIOD)
INNER JOIN CONTRACT_EQUIP_PERIOD cep ON cp.CONTRACT_PERIODOID = cep.CONTRACT_PERIODOID
INNER JOIN EQUIPMENT eq ON cep.EQUIPMENTOID = eq.EQUIPMENTOID
INNER JOIN HOOK_OFFICE ho ON khc.HOOK_OFFICEOID = ho.HOOK_OFFICEOID
WHERE
eq.PRODUCT_ID = 'XXX' AND
(eq.LOCATION_DESCRIPTION IS NULL OR
ho.HOOK_OFFICE_LETTER || LPAD(khc.HOOK_NO, 5, '0') <> eq.LOCATION_DESCRIPTION)
查询返回如下:
HOOKNO EQLOC
G00754 (null)
L02860 (null)
L04052 L12345
L01126 (null)
L01348 (null)
L01950 L56789
L00857 (null)
L04651 (null)
L03762 (null)
试了一下
UPDATE (SELECT ho.HOOK_OFFICE_LETTER || LPAD(khc.HOOK_NO, 5, '0') AS hookey, eq.LOCATION_DESCRIPTION AS eqloc
FROM KEY_HOOK_CURRENT khc
INNER JOIN KEY_HOLDING kho ON khc.KEY_HOLDINGOID = kho.KEY_HOLDINGOID
INNER JOIN CONTRACT con ON kho.CUSTOMEROID = con.CUSTOMEROID
INNER JOIN VW_CURRENT_CONTRACT_PERIOD ccp ON con.CONTRACT_ID = ccp.CONTRACT_ID
INNER JOIN CONTRACT_PERIOD cp ON (ccp.CONTRACT_ID = cp.CONTRACT_ID AND ccp.CONTRACT_PERIOD = cp.CONTRACT_PERIOD)
INNER JOIN CONTRACT_EQUIP_PERIOD cep ON cp.CONTRACT_PERIODOID = cep.CONTRACT_PERIODOID
INNER JOIN EQUIPMENT eq ON cep.EQUIPMENTOID = eq.EQUIPMENTOID
INNER JOIN HOOK_OFFICE ho ON khc.HOOK_OFFICEOID = ho.HOOK_OFFICEOID
WHERE
eq.PRODUCT_ID = 'XXX' AND
(eq.LOCATION_DESCRIPTION IS NULL OR (ho.HOOK_OFFICE_LETTER || LPAD(khc.HOOK_NO, 5, '0')) <> eq.LOCATION_DESCRIPTION))
SET hookno = eqloc
but getting 01733 - "virtual column not allowed"
...以及许多其他查询,包括合并,但没有太多经验,所以运气不好! :(
请注意:此查询将每 10 分钟 24/7 运行一次,因此它应该非常快(如果可能)并且仅在必要时更新。
您的帮助将不胜感激。
谢谢!
【问题讨论】:
-
这里可以使用 MERGE 语句,但是您需要某种方法来确定设备表中的哪些行需要更新。设备表的主键是什么?
标签: sql oracle sql-update inner-join