分配从一个表中的值到另一个表

问题描述 投票:1回答:3

有两个表表A和B表这些包含相同的列成本和项目。该表B中包含的项目及其相应的费用清单,而表A只包含的项目清单。

现在,我们需要检查表A的项目,如果它们存在于表B,然后输入相应项目的成本应在表A被分配到该项目的成本

有人可以帮我写一下本查询。

考虑表如下所示:

表A:

item    cost
------------- 
pen     null
book    null
watch   null

表B:

item     cost
------------- 
watch    1000
book     50

预计输出

Table A:

item    cost
pen       0
book     50
watch   1000
sql postgresql sql-update dml
3个回答
0
投票

只需添加在表B中的外键(表A的主键),你可以说一个表,然后ID添加一个连接(右连接而定)查询,以获得或转让的价格相应的项目。

join

SELECT item, cost
    FROM tablename a
    RIGHT JOIN tablename b ON a.item= b.item;

编辑:

只要编辑该表的名称,现在运行它。


0
投票

我想构建这样的更新:

with cost_data as (
  select
    item,
    max (cost) filter (where item = 'watch') as watch,
    max (cost) filter (where item = 'book') as book
  from table_b
  group by item
)
update table_a a
set
  watch = c.watch,
  book = c.book
from cost_data c
where
  a.item = c.item and
 (a.watch is distinct from c.watch or
  a.book is distinct from c.book)

从本质上说,我做的一个公共表表达式做表B上的穷人的透视表,以获取行成列。这里的一个警告 - 如果有同一项目列出了多项费用,这可能不是你想要的东西,但你需要知道如何处理,在几乎所有情况下。

然后我做了“的B更新”对CTE。

最后一部分是并不重要,本身,而是它是有益的 - 限制查询只在需要更改的行执行。这是最好的限制DML如果它并不需要发生(优化的东西是不是做的最好的方法)。


0
投票

有很多,你可以做到这一点,如果你正在服用表B为包含价格,然后左外连接会做的伎俩的一个途径。

SELECT
    table_a.item,
    CASE
        WHEN table_b.cost IS NULL
        THEN 0
        ELSE table_b.cost
    END as cost
FROM table_a
LEFT OUTER JOIN table_b ON table_a.item = table_b.item

结果似乎也表明,笔这是不是在B表应该有0价格(这是不好的做法),但返回所需结果的缘故,你会希望有一个case语句,如果它是空分配一个值。

为了更新表,按评论

update table_a set cost = some_alias.cost
from (
    SELECT
        table_a.item,
        CASE
        WHEN table_b.cost IS NULL
        THEN 0
        ELSE table_b.cost
        END as cost
    FROM table_a
    LEFT OUTER JOIN table_b ON table_a.item = table_b.item
) some_alias
where table_a.item = some_alias.item
© www.soinside.com 2019 - 2024. All rights reserved.