У меня две таблицы:
A [ID, column1, column2, column3]
B [ID, column1, column2, column3, column4]
A
всегда будет подмножеством B
(то есть все столбцы A
также входят в B
).
Я хочу обновить запись, указав ID
в ней B
свои данные A
для всех столбцов A
. Это ID
существует как в, так A
и в B
.
Есть ли UPDATE
синтаксис или какой-либо другой способ сделать это без указания имен столбцов, просто сказав «установить все столбцы A» ?
Я использую PostgreSQL, поэтому возможна также конкретная нестандартная команда (однако это не рекомендуется).
Ответы:
Вы можете использовать нестандартное предложение FROM .
источник
Вопрос старый, но я чувствовал, что лучшего ответа пока нет.
Общее решение с динамическим SQL
Вам не нужно знать какие-либо имена столбцов, кроме некоторых уникальных столбцов, к которым нужно присоединиться (
id
в примере). Работает надежно для любого возможного углового случая, о котором я могу подумать.Это характерно для PostgreSQL. Я создаю динамический код на основе information_schema , в частности таблицы
information_schema.columns
, которая определена в стандарте SQL, и большинство основных СУБД (кроме Oracle) имеют ее. НоDO
оператор с кодом PL / pgSQL, выполняющий динамический SQL, является совершенно нестандартным синтаксисом PostgreSQL.Предполагая, что соответствующий столбец входит
b
для каждого столбца вa
, но не наоборот.b
могут иметь дополнительные столбцы.WHERE b.id = 123
не является обязательным, чтобы обновить выбранную строку.SQL Fiddle.
Связанные ответы с дополнительными пояснениями:
Частичные решения с простым SQL
Со списком общих столбцов
Вам все еще нужно знать список имен столбцов, которые используются в обеих таблицах. С ярлыком синтаксиса для обновления нескольких столбцов - в любом случае короче, чем предлагали другие ответы.
SQL Fiddle.
Этот синтаксис был представлен в Postgres 8.2 в 2006 году, задолго до того, как был задан вопрос. Подробности в инструкции.
Связанный:
Со списком столбцов в
B
Если все столбцы
A
определеныNOT NULL
(но не обязательноB
),и вы знаете имена столбцов
B
(но не обязательноA
).Присоединяется
NATURAL LEFT JOIN
к строке, вb
которой все столбцы с одинаковым именем содержат одинаковые значения. В этом случае нам не нужно обновление (ничего не меняется), и мы можем удалить эти строки на ранней стадии процесса (WHERE b.id IS NULL
).Нам все еще нужно найти соответствующую строку, поэтому
b.id = ab.id
во внешнем запросе.db <> fiddle here
Старый sqlfiddle.
Это стандартный SQL, за исключением
FROM
предложения .Он работает независимо от того, какие столбцы на самом деле присутствуют
A
, но запрос не может различить фактические значения NULL и отсутствующие столбцыA
, поэтому он является надежным только в том случае, если все столбцыA
определеныNOT NULL
.Есть несколько возможных вариантов, в зависимости от того, что вы знаете об обеих таблицах.
источник
SET (column1) = (a.column)
), Postgres будет рассматривать это как еще один вид обновления и выдавать и выдавать ошибку следующим образом:source for a multiple-column UPDATE item must be a sub-SELECT or ROW() expression
Я работаю с базой данных IBM DB2 более десяти лет и сейчас пытаюсь изучить PostgreSQL.
Он работает в PostgreSQL 9.3.4, но не работает в DB2 10.5:
Примечание: Основная проблема заключается в причине, которая не поддерживается ни в DB2, ни в ANSI SQL.
Он работает в DB2 10.5, но НЕ работает в PostgreSQL 9.3.4:
НУ НАКОНЕЦ ТО! Он работает как с PostgreSQL 9.3.4, так и с DB2 10.5:
источник
B
, первый оператор ничего не делает (исходная строка остается нетронутой), а два других заменяют столбцы значениями NULL.Это большое подспорье. Код
работает отлично.
отметил, что вам нужна скобка "" в
чтобы заставить его работать.
источник
Не обязательно то, что вы просили, но, может быть, может помочь наследование postgres?
Это позволяет избежать необходимости обновлять B.
Но обязательно ознакомьтесь со всеми подробностями .
В противном случае то, что вы просите, не считается хорошей практикой - динамические вещи, такие как представления с,
SELECT * ...
не приветствуются (поскольку такое небольшое удобство может сломать больше вещей, чем помочь), и то, что вы просите, будет эквивалентно дляUPDATE ... SET
команды.источник
вы можете создать и выполнить динамический sql для этого, но это действительно не идеально
источник
Попробуйте подписаться
РЕДАКТИРОВАТЬ: - Обновить более одного столбца
источник
UPDATE
в MySQL , но недопустим для PostgreSQL.