簡體   English   中英

Postgresql 根據另一個表中的一組值更新列

[英]Postgresql update column based on set of values from another table

虛擬數據來說明我的問題:

create table table1 (category_id int,unit varchar,is_valid bool);

insert into table1 (category_id, unit, is_valid)
VALUES (1, 'a', true), (2, 'z', true);
create table table2 (category_id int,unit varchar);

insert into table2 (category_id, unit)
values(1, 'a'),(1, 'b'),(1, 'c'),(2, 'd'),(2, 'e');

所以數據看起來像:

表格1:

類別ID 單元 已驗證
1 一個 真的
2 z 真的

表 2:

類別ID 單元
1 一個
1 b
1 C
2 d
2 e

如果表 1 中的 category_id/unit 組合與表 2 中的任何行都不匹配,我想更新表 1 中的 is_valid 列。例如,表 1 中的第一行是有效的,因為 (1, a)在表 2 中。但是,表 1 中的第二行無效,因為 (2, z) 不在表 2 中。

如何使用 postgresql 更新列? 我嘗試了UPDATE table1 SET is_valid = false WHERE...形式的幾個不同的 where 子句,但我無法獲得一個按我想要的方式工作的 WHERE 子句。

您可以將is_valid的值設置為 ` where exists (select ...) 的結果。 請參閱演示

update table1 t1
   set is_valid = exists (select null 
                            from table2 t2 
                           where (t2.category_id, t2.unit) = (t1.category_id, t1.unit) 
                         ); 

筆記:

  • 優點:查詢正確設置is_valid列,而不管當前值如何,並且是一個不同的簡單查詢。
  • 缺點:查詢為表中的每一行設置is_valid的值; 即使已經正確設置。

您需要決定是否將劣勢排除在優勢之外。 如果是這樣,那么在更復雜的查詢中使用相同的基本技術:

with to_valid (category_id, unit, is_valid) as 
     (select category_id
           , unit
           , exists (select null 
                       from table2 t2 
                      where (t2.category_id, t2.unit) = (t1.category_id, t1.unit) 
                    ) 
       from table1 t1
     ) 
update table1  tu
   set is_valid = to_valid.is_valid 
  from to_valid 
 where (tu.category_id, tu.unit) = (to_valid.category_id, to_valid.unit) 
   and tu.is_valid is distinct from to_valid.is_valid;

暫無
暫無

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

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