Mam dwa stoliki:
A [ID, column1, column2, column3]
B [ID, column1, column2, column3, column4]
A
zawsze będzie podzbiorem B
(co oznacza, że wszystkie kolumny A
są również w B
).
Chcę zaktualizować rekord o konkretny ID
w B
z ich danymi z A
dla wszystkich kolumn A
. To ID
istnieje zarówno w, jak A
i B
.
Czy istnieje UPDATE
składnia lub inny sposób na zrobienie tego bez podawania nazw kolumn, po prostu mówiąc „ustaw wszystkie kolumny A” ?
Używam PostgreSQL, więc akceptowana jest również określona niestandardowa komenda (jednak nie jest preferowana).
Odpowiedzi:
Możesz użyć niestandardowej klauzuli FROM .
źródło
Pytanie jest stare, ale czułem, że nie otrzymałem jeszcze najlepszej odpowiedzi.
Ogólne rozwiązanie z dynamicznym SQL
Nie musisz znać żadnych nazw kolumn poza kilkoma unikatowymi kolumnami, do których chcesz dołączyć (
id
w przykładzie). Działa niezawodnie w każdym możliwym przypadku narożnym, o którym mogę pomyśleć.Jest to specyficzne dla PostgreSQL. Buduję kod dynamiczny w oparciu o schemat information_schema , w szczególności tabelę
information_schema.columns
, która jest zdefiniowana w standardzie SQL i ma ją większość głównych RDBMS (poza Oracle). AleDO
instrukcja z kodem PL / pgSQL wykonującym dynamiczny SQL jest całkowicie niestandardową składnią PostgreSQL.Zakładając pasującą kolumnę w
b
dla każdej kolumny wa
, ale nie odwrotnie.b
może mieć dodatkowe kolumny.WHERE b.id = 123
jest opcjonalne, aby zaktualizować wybrany wiersz.SQL Fiddle.
Powiązane odpowiedzi z dokładniejszym wyjaśnieniem:
Częściowe rozwiązania ze zwykłym SQL
Z listą wspólnych kolumn
Nadal musisz znać listę nazw kolumn, które współużytkują obie tabele. Ze skrótem do składni do aktualizowania wielu kolumn - w każdym przypadku krótszym niż sugerowały inne odpowiedzi.
SQL Fiddle.
Ta składnia została wprowadzona w Postgres 8.2 w 2006 roku, na długo przed zadaniem pytania. Szczegóły w instrukcji.
Związane z:
Z listą kolumn w formacie
B
Jeśli wszystkie kolumny
A
są zdefiniowaneNOT NULL
(ale nie koniecznieB
),a ty znać nazwy kolumn z
B
(ale nie koniecznieA
).NATURAL LEFT JOIN
Dołącza do wiersza zb
którym wszystkie kolumny o tej samej nazwie posiadają te same wartości. W tym przypadku nie potrzebujemy aktualizacji (nic się nie zmienia) i możemy wyeliminować te wiersze na wczesnym etapie procesu (WHERE b.id IS NULL
).Nadal musimy znaleźć pasujący wiersz, więc
b.id = ab.id
w zewnętrznym zapytaniu.db <> skrzypce tutaj
Stare sqlfiddle.
To jest standardowy SQL z wyjątkiem
FROM
klauzuli .Działa bez względu na to, która z kolumn jest faktycznie obecna w programie
A
, ale zapytanie nie może odróżnić rzeczywistych wartości NULL od brakujących kolumn wA
, więc jest wiarygodne tylko wtedy, gdyA
zdefiniowane są wszystkie kolumny wNOT NULL
.Istnieje wiele możliwych odmian, w zależności od tego, co wiesz o obu stołach.
źródło
SET (column1) = (a.column)
) Postgres potraktuje to jako inny rodzaj aktualizacji i poda i błąd w ten sposób:source for a multiple-column UPDATE item must be a sub-SELECT or ROW() expression
Pracuję z bazą danych IBM DB2 od ponad dziesięciu lat, a teraz próbuję nauczyć się PostgreSQL.
Działa na PostgreSQL 9.3.4, ale nie działa na DB2 10.5:
Uwaga: Główny problem dotyczy przyczyny OD, która nie jest obsługiwana w programie DB2, a także w języku ANSI SQL.
Działa na DB2 10.5, ale NIE działa na PostgreSQL 9.3.4:
WRESZCIE! Działa na PostgreSQL 9.3.4 i DB2 10.5:
źródło
B
, pierwsza instrukcja nic nie robi (oryginalny wiersz pozostaje nietknięty), podczas gdy pozostałe dwie nadpisują kolumny wartościami NULL.To jest wielka pomoc. Kod
działa świetnie.
zauważył, że potrzebujesz nawiasu „” w
żeby to działało.
źródło
Niekoniecznie to, o co pytałeś, ale może użycie dziedziczenia postgres może pomóc?
Pozwala to uniknąć konieczności aktualizacji B.
Ale pamiętaj, aby przeczytać wszystkie szczegóły .
W przeciwnym razie to, o co prosisz, nie jest uważane za dobrą praktykę - dynamiczne rzeczy, takie jak widoki z,
SELECT * ...
są odradzane (ponieważ taka niewielka wygoda może zepsuć więcej rzeczy niż pomoc), a to, o co prosisz, byłoby równoważne dlaUPDATE ... SET
polecenia.źródło
możesz w tym celu zbudować i uruchomić dynamiczny sql, ale nie jest to idealne rozwiązanie
źródło
Spróbuj obserwować
ZMIENIONO: - Zaktualizuj więcej niż jedną kolumnę
źródło
UPDATE
w MySQL , ale jest nieprawidłowa dla PostgreSQL.