Присвоение значения из одной таблицы в другую таблицу - PullRequest
0 голосов
/ 07 февраля 2019

Есть две таблицы Таблица A и Таблица B. Они содержат одинаковые столбцы стоимости и позиции.Таблица B содержит список предметов и их соответствующие затраты, тогда как таблица A содержит только список предметов.

Теперь нам нужно проверить элементы таблицы A, если они присутствуют в таблице B, тосоответствующая стоимость предмета должна быть отнесена к стоимости предмета в таблице А.

Может ли кто-нибудь помочь мне, написав запрос на это.

Рассмотрим таблицы, как показано:

Таблица 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

Ответы [ 3 ]

0 голосов
/ 07 февраля 2019

Существует множество способов сделать это, если вы возьмете в качестве таблицы 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
0 голосов
/ 07 февраля 2019

Я бы структурировал обновление следующим образом:

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, чтобы получить строки в столбцах.Одно предостережение: если для одного и того же предмета указаны несколько расходов, это может сделать не то, что вы хотите, но тогда вам нужно знать, как справиться с этим практически в любом случае.

Тогда я делаю"обновление A из B" для CTE.

Последняя часть, по сути, не критична, но полезна - ограничить выполнение запроса только теми строками, которые необходимо изменить.Лучше ограничить DML, если это не требуется (лучший способ оптимизировать что-либо - это не делать этого).

0 голосов
/ 07 февраля 2019

Просто добавьте внешний ключ (первичный ключ таблицы A) в таблицу B, как можно сказать в таблице A ID, затем добавьте объединение (может быть правое объединение) в запрос, чтобы получить или назначить цены для соответствующих позиций.

join быть похожим на

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

Редактировать:

Просто отредактируйте это имя таблицы, теперь запустите его.

...