[英]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.