簡體   English   中英

您可以在 where 子句中使用分區更新表嗎?

[英]Can you update a table using a partition within the where clause?

我有一個問題:

SELECT *, ORDER = MAX(ORDER) OVER (PARTITION BY ID)
FROM MY TABLE

MY_TABLE 目前在哪里

ID 命令 年齡 最近的
12 34 50 真的
99 41 17 真的
12 34 24 真的
99 42 12 真的
12 33 15 真的
12 33 38 真的

我希望將表更新為查詢結果

ID 命令 年齡 最近的
12 34 50 真的
99 41 17 錯誤的
12 34 24 真的
99 42 12 真的
12 33 15 錯誤的
12 33 38 錯誤的

有沒有辦法用 UPDATE 語句來做到這一點。

我在嘗試

UPDATE MY_TABLE
SET RECENT = FALSE
WHERE ORDER <> MAX(ORDER) OVER (PARTITION BY ID);

但我不確定如何將分區語句合並到更新中。

試試這個:

update my_table
set recent = false
where (id, order) not in (select id, max(order) from my_table group by 1); 

正如@Tim Biegeleisen 所建議的那樣,將其作為更新運行可能不是最好的主意。 您可以在其頂部創建一個視圖以始終顯示最新信息,而不需要更新表格,而不是更新表格。 這消除了在添加新值和執行更新過程之間RECENT列過時的風險。

CREATE TABLE my_tbl (id NUMBER, "ORDER" NUMBER, age NUMBER);

INSERT INTO my_tbl VALUES 
(12, 34, 50),
(99, 41, 17),
(12, 34, 24),
(99, 42, 12),
(12, 33, 15),
(12, 33, 38);

CREATE OR REPLACE VIEW my_view AS
SELECT
    *,
    "ORDER" = MAX("ORDER") OVER (PARTITION BY ID) AS RECENT
FROM
    my_tbl
;

這給出了 output:

ID 命令 年齡 最近的
12 34 50 真的
99 41 17 錯誤的
12 34 24 真的
99 42 12 真的
12 33 15 錯誤的
12 33 38 錯誤的

添加另一行:

INSERT INTO my_tbl VALUES (12, 35, 51);

給出:

ID 命令 年齡 最近的
12 34 50 錯誤的
99 41 17 錯誤的
12 34 24 錯誤的
99 42 12 真的
12 33 15 錯誤的
12 33 38 錯誤的
12 35 51 真的

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM