有两个表表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
只需添加在表B中的外键(表A的主键),你可以说一个表,然后ID
添加一个连接(右连接而定)查询,以获得或转让的价格相应的项目。
join
像
SELECT item, cost
FROM tablename a
RIGHT JOIN tablename b ON a.item= b.item;
编辑:
只要编辑该表的名称,现在运行它。
我想构建这样的更新:
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如果它并不需要发生(优化的东西是不是做的最好的方法)。
有很多,你可以做到这一点,如果你正在服用表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