【问题标题】:Assigning a value from one table to other table将一个表中的值分配给另一个表
【发布时间】:2019-07-01 09:48:18
【问题描述】:

有两个表表 A 和表 B。它们包含相同的列 cost 和 item。表 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


    【解决方案1】:

    只需在表 B 中添加一个外键(表 A 的主键),如表 A ID 然后在查询中添加一个联接(可能是右联接)以获取或分配相应项目的价格。

    join 喜欢

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

    编辑:

    只需编辑这个表名,现在运行它。

    【讨论】:

    • 根据您的查询,我们无法将项目名称分配给成本。它会抛出一个错误,顺便说一下选择是要显示的,但我需要将成本值分配给表 B 中的表 A 中的项目。
    【解决方案2】:

    我会像这样构建更新:

    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 上做一个穷人的数据透视表,以将行放入列中。这里有一个警告——如果为同一个项目列出了多个成本,这可能无法满足您的需求,但是您几乎需要知道如何处理它。

    然后我正在针对 CTE 执行“从 B 更新 A”。

    最后一部分本身并不重要,但它很有帮助——将查询限制为仅在需要更改的行上执行。如果 DML 不需要发生,最好限制它(优化某事的最好方法是不做)。

    【讨论】:

      【解决方案3】:

      有很多方法可以做到这一点,如果您将表 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
      

      【讨论】:

      • 谢谢!这工作正确。但我希望将值分配给表 A 中的项目。您的查询不会发生这种情况。
      • update table_a from -> sql query -> where item = query.item 你应该可以从那里得到它
      • 这不正确。 table_a 中的所有 cost 值都赋值为 0。
      • 这确实闻起来很像家庭作业,但为了完整起见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
      猜你喜欢
      • 1970-01-01
      • 2018-04-03
      • 1970-01-01
      • 2012-06-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多