[SQL] 포스트 그레스에 절을 반환 인 UPDATE에서 선택할 수 없습니다
SQL포스트 그레스에 절을 반환 인 UPDATE에서 선택할 수 없습니다
나는 훨씬 더 복잡한 쿼리에서 문제를 isolatet. 테스트 시나리오 여기
DROP TABLE test;
CREATE TABLE test (
id integer,
description varchar(100)
);
INSERT INTO test(id, description) VALUES (1,'new');
INSERT INTO test(id, description) VALUES (2,'new');
나는 쿼리를 실행하는 경우 :
SELECT * FROM test WHERE id IN (UPDATE test set description='test' RETURNING id)
나는 다음과 같은 오류를 받고 있어요 :
오류 : 구문에서 오류 또는 근처에 "테스트" LINE 1 테스트 자료 (UPDATE 테스트 세트 정보 = '검사'RE * FROM SELECT ... ^
***
해결법
-
==============================
1.PostgreSQL의 9.1 INSERT / UPDATE 전에 / DELETE는 최고 수준의 진술로 사용할 수 있습니다. 당신이 구문 오류가 발생하는 이유입니다.
PostgreSQL의 9.1 INSERT / UPDATE 전에 / DELETE는 최고 수준의 진술로 사용할 수 있습니다. 당신이 구문 오류가 발생하는 이유입니다.
9.1에서 시작 당신은 공통 테이블 표현식과 데이터 수정 문을 사용할 수 있습니다. 귀하의 예를 들어 쿼리는 다음과 같을 것이다 :
WITH updated AS (UPDATE test SET description = 'test' RETURNING id) SELECT * FROM test WHERE id IN (SELECT id FROM updated);
방금 수정 한 테이블에서 선택에주의하십시오. 당신은 그런 식으로 결과를 혼란 얻을 수 있습니다. 쿼리가 같은 스냅 샷으로 실행됩니다 Becuse의 SELECT는 UPDATE 문의 효과를 볼 수 없습니다.
-
==============================
2.당신은 영향을받는 행을 제한하기 위해 WHERE 절을 추가하여 업데이트 쿼리에서 두 행을 업데이트합니다.
당신은 영향을받는 행을 제한하기 위해 WHERE 절을 추가하여 업데이트 쿼리에서 두 행을 업데이트합니다.
UPDATE test SET description = 'test' WHERE id = 1 RETURNING id
하나의 행을 반환합니다.
-
==============================
3.... 아이디 IN (UPDATE ... : 당신은 IN 누락?
... 아이디 IN (UPDATE ... : 당신은 IN 누락?
귀하의 UPDATE없이 WHERE 절을 가지고 있으며, 따라서이 두 가지가있는 모든 행을 업데이트합니다.
-
==============================
4.
UPDATE test set description='test' RETURNING *
초기 쿼리에서 기대하는 당신에게 결과 집합을 줄 것입니다.
하지만 난 당신이 더 복잡한 뭔가를하려고했던 생각?
-
==============================
5.당신은 당신의 where 절을 제한하지 않습니다. 당신은 = ID가 있어야합니다 (blabla) 또는 아이디 IN (blabla)
당신은 당신의 where 절을 제한하지 않습니다. 당신은 = ID가 있어야합니다 (blabla) 또는 아이디 IN (blabla)
-
==============================
6.
DROP TABLE IF EXISTS test_tab; CREATE TABLE test_tab ( id integer, description varchar(100) ); INSERT INTO test_tab(id, description) VALUES (1,'new'); INSERT INTO test_tab(id, description) VALUES (2,'new'); SELECT * from test_tab; DO $$ DECLARE myID test_tab.id%TYPE; testID test_tab.id%TYPE; cur_IDs CURSOR for select id from test_tab; BEGIN OPEN cur_IDs; LOOP FETCH cur_IDs into testID; EXIT WHEN testID is NULL; UPDATE test_tab SET description='test' WHERE id = testID RETURNING id into myID; raise notice 'myID %', myID; END LOOP; CLOSE cur_IDs; END$$; DROP TABLE IF EXISTS test_tab;
-
==============================
7.사용하여, 같은 테이블에 선택하면 나는 개미 Aasma에서 추가 해요 :
사용하여, 같은 테이블에 선택하면 나는 개미 Aasma에서 추가 해요 :
WITH updated AS (UPDATE test SET description = 'test' RETURNING id, description) SELECT * FROM updated;
from https://stackoverflow.com/questions/7191902/cannot-select-from-update-returning-clause-in-postgres by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] 두 번째 SELECT 쿼리의 경우 첫 번째 SELECT 반환 0 행 (0) | 2020.06.11 |
---|---|
[SQL] SQL에 LINQ : 어떻게 이름이 변경되는 자동 생성 된 개체 이름을 중지합니까? (0) | 2020.06.11 |
[SQL] 는 SQL Server 통합 서비스를 사용하여 Oracle 데이터베이스에 연결 (0) | 2020.06.11 |
[SQL] 나는 복합 기본 키 여부를 사용해야합니까? (0) | 2020.06.11 |
[SQL] 어떻게 T-SQL을 사용하여 문자열에서 숫자 부분을 얻으려면? (0) | 2020.06.11 |