如何針對表中的特定 fk_ID 更新所有行(所有行中的列),其中匹配列也存在于同一個表中針對不同的 fk_ID。
例如,我有一個表A,它有列 ID、專案、狀態
| fk_ID | 物品 | 地位 |
|---|---|---|
| 10 | AB | 是 |
| 10 | 作為 | ? |
| 11 | 斧頭 | ? |
| 10 | 廣告 | ? |
| 11 | AB | ? |
| 11 | 廣告 | 是 |
我想用 fk_ID = 11 更改所有行的狀態,因為它是針對 fk_ID = 10
到目前為止我已經嘗試過
update table b set b.status = b.status where b.fk_ID = '11' Self JOIN ON b.fk_ID = 10;
uj5u.com熱心網友回復:
如果你想只更新部分行集為fk_id那里是一個匹配的10item對fk_id11,那么你可以使用一個MERGE陳述句:
MERGE INTO table_name dst
USING (
SELECT item, status
FROM table_name
WHERE fk_id = 11
) src
ON (dst.fk_id = 10 AND src.item = dst.item)
WHEN MATCHED THEN
UPDATE SET status = src.status;
其中,對于您的示例資料:
CREATE TABLE table_name (fk_ID, Item, Status) AS
SELECT 10, 'AB', 'Y' FROM DUAL UNION ALL
SELECT 10, 'AS', 'N' FROM DUAL UNION ALL
SELECT 11, 'AX', 'N' FROM DUAL UNION ALL
SELECT 10, 'AD', 'N' FROM DUAL UNION ALL
SELECT 11, 'AB', 'N' FROM DUAL UNION ALL
SELECT 11, 'AD', 'Y' FROM DUAL;
合并之后:
SELECT *
FROM table_name;
輸出:
FK_ID 物品 地位 10 AB ? 10 作為 ? 11 斧頭 ? 10 廣告 是 11 AB ? 11 廣告 是
如果要更改所有值(洗掉fk_id11 中不存在的專案,然后插入/更新新/修改的專案),則需要兩個陳述句:
DELETE FROM table_name
WHERE fk_id = 10
AND item NOT IN (SELECT item FROM table_name WHERE fk_id = 11);
MERGE INTO table_name dst
USING (
SELECT item, status
FROM table_name
WHERE fk_id = 11
) src
ON (dst.fk_id = 10 AND src.item = dst.item)
WHEN MATCHED THEN
UPDATE SET status = src.status
WHEN NOT MATCHED THEN
INSERT (fk_id, item, status) VALUES (10, src.item, src.status);
然后:
SELECT *
FROM table_name;
輸出:
FK_ID 物品 地位 10 AB ? 11 斧頭 ? 10 廣告 是 11 AB ? 11 廣告 是 10 斧頭 ?
db<>在這里擺弄
uj5u.com熱心網友回復:
假設您的表的主鍵是ITEMandFK_ID并且您希望將狀態從to傳遞FK_ID 10給11。
此查詢為您提供狀態概覽
select t11.*, t10.status s_t10
from table_name t11
join table_name t10 on t11.item = t10.item
and t11.fk_id = 11 and t10.fk_id = 10;
FK_ID IT S S_T10
---------- -- - -
11 AB N Y
11 AD Y N
因此,您希望更新兩行。
您可以將此連接查詢用作可更新連接視圖,如下所示
update (
select t11.*, t10.status status_t10
from table_name t11
join table_name t10 on t11.item = t10.item
and t11.fk_id = 11 and t10.fk_id = 10)
set status = status_t10;
2 rows updated.
結果
select * from table_name
FK_ID IT S
---------- -- -
10 AB Y
10 AS N
11 AX N
10 AD N
11 AB Y <<--- update
11 AD N <<--- update
請注意,上述關于 的假設PK必須有效(或至少必須定義一個唯一索引,否則 Oracle 將失敗并顯示ORA-01779: cannot modify a column which maps to a non key-preserved table.
這是meaningfull,因為如果你有更多的行相同item的FK_ID = 10-你應該怎樣用于更新?
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/407732.html
標籤:
