복붙노트

[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. ==============================

    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. ==============================

    2.당신은 영향을받는 행을 제한하기 위해 WHERE 절을 추가하여 업데이트 쿼리에서 두 행을 업데이트합니다.

    당신은 영향을받는 행을 제한하기 위해 WHERE 절을 추가하여 업데이트 쿼리에서 두 행을 업데이트합니다.

    UPDATE test SET description = 'test' WHERE id = 1 RETURNING id
    

    하나의 행을 반환합니다.

  3. ==============================

    3.... 아이디 IN (UPDATE ... : 당신은 IN 누락?

    ... 아이디 IN (UPDATE ... : 당신은 IN 누락?

    귀하의 UPDATE없이 WHERE 절을 가지고 있으며, 따라서이 두 가지가있는 모든 행을 업데이트합니다.

  4. ==============================

    4.

    UPDATE test set description='test' RETURNING *
    

    초기 쿼리에서 기대하는 당신에게 결과 집합을 줄 것입니다.

    하지만 난 당신이 더 복잡한 뭔가를하려고했던 생각?

  5. ==============================

    5.당신은 당신의 where 절을 제한하지 않습니다. 당신은 = ID가 있어야합니다 (blabla) 또는 아이디 IN (blabla)

    당신은 당신의 where 절을 제한하지 않습니다. 당신은 = ID가 있어야합니다 (blabla) 또는 아이디 IN (blabla)

  6. ==============================

    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. ==============================

    7.사용하여, 같은 테이블에 선택하면 나는 개미 Aasma에서 추가 해요 :

    사용하여, 같은 테이블에 선택하면 나는 개미 Aasma에서 추가 해요 :

    WITH updated AS (UPDATE test SET description = 'test' RETURNING id, description)
    SELECT * FROM updated;
    
  8. from https://stackoverflow.com/questions/7191902/cannot-select-from-update-returning-clause-in-postgres by cc-by-sa and MIT license