다른 테이블의 필드에서 한 테이블의 SQL 업데이트 필드
두 개의 테이블이 있습니다.
A [ID, column1, column2, column3]
B [ID, column1, column2, column3, column4]
A
항상 의 하위 집합이 됩니다.B
(의 모든 열을 의미함)A
에도 있습니다.B
).
특정 레코드를 업데이트합니다.ID
에B
그들의 자료로A
의 모든 란에 대하여A
.이것.ID
둘 다 존재합니다.A
그리고.B
.
있나요?UPDATE
구문 또는 열 이름을 지정하지 않고 "A의 모든 열 설정"이라고만 말하는 다른 방법이 있습니까?
저는 Postgre를 사용하고 있습니다.SQL. 따라서 특정 비표준 명령도 허용됩니다(단, 선호하지는 않음).
비표준 FROM 절을 사용할 수 있습니다.
UPDATE b
SET column1 = a.column1,
column2 = a.column2,
column3 = a.column3
FROM a
WHERE a.id = b.id
AND b.id = 1
그 질문은 오래되었지만, 저는 아직 최고의 답이 나오지 않았다고 느꼈습니다.
있나요?
UPDATE
열 이름을 지정하지 않고 구문...
동적 SQL을 사용하는 일반 솔루션
두 테이블의 기본 키 열만 알고 있음
(id
예에서) 조인할 일부 고유한 열을 제외하고는 열 이름을 알 필요가 없습니다.제가 생각할 수 있는 모든 가능한 코너 케이스에 대해 안정적으로 작동합니다.
이것은 Postgre에만 해당됩니다.SQL. 저는 information_schema, 특히 SQL 표준에 정의된 테이블을 기반으로 동적 코드를 구축하고 있으며 대부분의 주요 RDBMS(오라클 제외)가 가지고 있습니다.그러나 동적 SQL을 실행하는 PL/pgSQL 코드가 있는 문은 완전히 비표준 Postgre입니다.SQL 구문입니다.
DO
$do$
BEGIN
EXECUTE (
SELECT
'UPDATE b
SET (' || string_agg( quote_ident(column_name), ',') || ')
= (' || string_agg('a.' || quote_ident(column_name), ',') || ')
FROM a
WHERE b.id = 123
AND a.id = b.id'
FROM information_schema.columns
WHERE table_name = 'a' -- table name, case sensitive
AND table_schema = 'public' -- schema name, case sensitive
AND column_name <> 'id' -- all columns except id
);
END
$do$;
일치하는 열로 가정b
의 모든 란에 대하여a
하지만 그 반대는 아닙니다. b
열을 추가할 수 있습니다.
WHERE b.id = 123
선택한 행을 업데이트할 수 있습니다.
db<>여기로 이동
올드 sqlifiddle
자세한 설명이 포함된 관련 답변:
일반 SQL을 사용하는 부분 솔루션
공유 열의 목록 아는 중
두 테이블이 공유하는 열 이름 목록을 알고 있습니다.여러 열을 업데이트할 수 있는 구문 바로 가기를 사용하여 지금까지 다른 답변이 제안한 것보다 짧습니다.
UPDATE b
SET ( column1, column2, column3)
= (a.column1, a.column2, a.column3)
FROM a
WHERE b.id = 123 -- optional, to update only selected row
AND a.id = b.id;
db<>여기로 이동
올드 sqlifiddle
이 구문은 질문하기 훨씬 전인 2006년 Postgres 8.2에 도입되었습니다.설명서의 세부 정보.
관련:
의 열 목록을 알고 있는 중B
의모 열경우의 모든 A
된 정됨의입니다.NOT NULL
, 반드시 (단, 반시모열아님은든드)의 은 아닙니다.)B
),
그리고 당신은 열 이름을 알고 있습니다.B
(으)ㄹ 필요는 없습니다.A
).
UPDATE b
SET (column1, column2, column3, column4)
= (COALESCE(ab.column1, b.column1)
, COALESCE(ab.column2, b.column2)
, COALESCE(ab.column3, b.column3)
, COALESCE(ab.column4, b.column4)
)
FROM (
SELECT *
FROM a
NATURAL LEFT JOIN b -- append missing columns
WHERE b.id IS NULL -- only if anything actually changes
AND a.id = 123 -- optional, to update only selected row
) ab
WHERE b.id = ab.id;
에서 행을 조인합니다.b
여기서 같은 이름의 모든 열에는 동일한 값이 포함됩니다.변경되지 않음) 초기에 할 수 .WHERE b.id IS NULL
).
일치하는 행을 하기 에, 우는여일전행찾합을니다아야는리치하히▁we,합다니▁so찾▁row.b.id = ab.id
외부 질문에
db<>여기로 이동
올드 sqlifiddle
절을 제외한 표준 SQL입니다.
실제로 어떤 열에 있는지에 관계없이 작동합니다.A
할 수 .A
따라서 모든 열이 의 경우에만 신뢰할 수 있습니다.A
된 정됨의입니다.NOT NULL
.
두 표에 대해 알고 있는 내용에 따라 여러 가지 변형이 있을 수 있습니다.
저는 10년 이상 IBM DB2 데이터베이스와 함께 일했고 지금은 Postgre를 배우려고 노력하고 있습니다.SQL.
Postgre에서 작동합니다.SQL 9.3.4, 그러나 DB2 10.5에서는 작동하지 않습니다.
UPDATE B SET
COLUMN1 = A.COLUMN1,
COLUMN2 = A.COLUMN2,
COLUMN3 = A.COLUMN3
FROM A
WHERE A.ID = B.ID
참고: 주요 문제는 DB2 및 ANSI SQL에서 지원되지 않는 FROM 원인입니다.
DB2 10.5에서는 작동하지만 Postgre에서는 작동하지 않습니다.SQL 9.3.4:
UPDATE B SET
(COLUMN1, COLUMN2, COLUMN3) =
(SELECT COLUMN1, COLUMN2, COLUMN3 FROM A WHERE ID = B.ID)
드디어!Postgre 모두에서 작동합니다.SQL 9.3.4 및 DB2 10.5:
UPDATE B SET
COLUMN1 = (SELECT COLUMN1 FROM A WHERE ID = B.ID),
COLUMN2 = (SELECT COLUMN2 FROM A WHERE ID = B.ID),
COLUMN3 = (SELECT COLUMN3 FROM A WHERE ID = B.ID)
이 것은 큰 도움이에요.코드
UPDATE tbl_b b
SET ( column1, column2, column3)
= (a.column1, a.column2, a.column3)
FROM tbl_a a
WHERE b.id = 1
AND a.id = b.id;
완벽하게 작동합니다.
괄호 "가 필요합니다.
From "tbl_a" a
효과가 있을 거예요
꼭 요청하신 것은 아니지만 사후 상속을 사용하는 것이 도움이 될까요?
CREATE TABLE A (
ID int,
column1 text,
column2 text,
column3 text
);
CREATE TABLE B (
column4 text
) INHERITS (A);
이렇게 하면 B를 업데이트할 필요가 없습니다.
하지만 모든 세부사항을 읽도록 하세요.
그렇지 않으면, 당신이 요구하는 것은 좋은 관행으로 간주되지 않습니다 - 예를 들어, 보기와 같은 동적인 것.SELECT * ...
낙담하고 있습니다(그렇게 작은 편의가 도움이 되는 것보다 더 많은 것을 깨뜨릴 수 있기 때문입니다). 그리고 당신이 요구하는 것은 그것과 동등할 것입니다.UPDATE ... SET
지휘권
이를 위해 동적 SQL을 구축하고 실행할 수 있지만, 그것은 정말 이상적이지 않습니다.
팔로우 해보기
Update A a, B b, SET a.column1=b.column1 where b.id=1
편집됨:- 둘 이상의 열 업데이트
Update A a, B b, SET a.column1=b.column1, a.column2=b.column2 where b.id=1
언급URL : https://stackoverflow.com/questions/2763817/sql-update-fields-of-one-table-from-fields-of-another-one
'programing' 카테고리의 다른 글
Postgresql에 제목이 있는 CSV로 테이블을 내보내는 방법은 무엇입니까? (0) | 2023.05.15 |
---|---|
WPF 컨트롤의 여백 속성의 일부만 바인딩 (0) | 2023.05.15 |
Python의 함수 체인 (0) | 2023.05.15 |
특정 화이트리스트를 제외한 모든 HTML 태그를 필터링하려면 어떻게 해야 합니까? (0) | 2023.05.15 |
Xcode에서 기호 파일 처리 (0) | 2023.05.10 |