복붙노트

[SQL] 포스트 그레스 오류 : 표현으로 사용되는 하위 쿼리에 의해 반환 된 둘 이상의 행

SQL

포스트 그레스 오류 : 표현으로 사용되는 하위 쿼리에 의해 반환 된 둘 이상의 행

나는 두 개의 별도의 데이터베이스를 가지고있다. 나는 다른 데이터베이스에서 컬럼의 값을 하나의 데이터베이스에 열을 업데이트하려합니다 :

UPDATE customer
SET customer_id=
   (SELECT t1 FROM dblink('port=5432, dbname=SERVER1 user=postgres password=309245',
   'SELECT store_key FROM store') AS (t1 integer));

이것은 내가 수신하고있는 오류입니다 :

어떤 아이디어?

해결법

  1. ==============================

    1.기술적으로, 당신의 문을 수리하기 위해, 당신은 최대 1 행이 반환되는 것을 보장하기 위해 하위 쿼리에 LIMIT 1을 추가 할 수 있습니다. 오류를 제거하는 것 즉, 코드는 여전히 말도 안되는 것입니다.

    기술적으로, 당신의 문을 수리하기 위해, 당신은 최대 1 행이 반환되는 것을 보장하기 위해 하위 쿼리에 LIMIT 1을 추가 할 수 있습니다. 오류를 제거하는 것 즉, 코드는 여전히 말도 안되는 것입니다.

    ... 'SELECT store_key FROM store LIMIT 1' ...

    실제로, 당신은 당신의 로컬 테이블 고객의 모든 행을 업데이트하기 위해 원격 테이블 저장소에서 임의의 행을 따기 대신 어떻게 든 행을 일치합니다. 나는이 예제를 위해 두 테이블에 텍스트 열 MATCH_NAME 가정 (및 저장에 UNIQUE) 오전 귀하의 초보적인 질문은 충분한 정보를 제공하지 않습니다

    ... 'SELECT store_key FROM store
         WHERE match_name = ' || quote_literal(customer.match_name)  ...

    하지만 그 일을 매우 비싼 방법입니다.

    이상적으로, 당신은 완전히 문을 다시 작성해야합니다.

    UPDATE customer c
    SET    customer_id = s.store_key
    FROM   dblink('port=5432, dbname=SERVER1 user=postgres password=309245'
                 ,'SELECT match_name, store_key FROM store')
           AS s(match_name text, store_key integer)
    WHERE c.match_name = s.match_name
    AND   c.customer_id IS DISTINCT FROM s.store_key;
    

    이 구제 원래 문에 많은 문제.

  2. ==============================

    2.이것은 당신의 중첩 된 SELECT 반환에게 하나 개 이상의 행을 의미합니다.

    이것은 당신의 중첩 된 SELECT 반환에게 하나 개 이상의 행을 의미합니다.

    당신은에 적절한 WHERE 절을 추가해야합니다.

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

    3.당신은 일대 다 관계를 가지고있는 곳 근본적인 문제는 종종 단지의 경우, IN에 =을 변경하여 해결할 수 있습니다. 예를 들어, 업데이트하거나 해당 고객 계정의 무리를 삭제하기를 원한다면 :

    당신은 일대 다 관계를 가지고있는 곳 근본적인 문제는 종종 단지의 경우, IN에 =을 변경하여 해결할 수 있습니다. 예를 들어, 업데이트하거나 해당 고객 계정의 무리를 삭제하기를 원한다면 :

    WITH accounts_to_delete AS 
        ( 
            SELECT     account_id
            FROM       accounts a
            INNER JOIN customers c
                    ON a.customer_id = c.id
            WHERE      c.customer_name='Some Customer'
        )
    
    -- this fails if "Some Customer" has multiple accounts, but works if there's 1:
    DELETE FROM accounts
     WHERE accounts.guid = 
    ( 
        SELECT account_id 
        FROM   accounts_to_delete 
    );
    
    -- this succeeds with any number of accounts:
    DELETE FROM accounts
     WHERE accounts.guid IN   
    ( 
        SELECT account_id 
        FROM   accounts_to_delete 
    );
    
  4. ==============================

    4.이 오류 수단은 저장 쿼리에서 SELECT store_key는 SERVER1 데이터베이스에 두 개 이상의 행을 반환했다고. 모든 고객을 업데이 트하려는 경우 대신 스칼라 = 연산자의 조인을 사용. 당신은 그렇게하기 위해 저장 항목에 "연결"고객에게 조건이 필요합니다.

    이 오류 수단은 저장 쿼리에서 SELECT store_key는 SERVER1 데이터베이스에 두 개 이상의 행을 반환했다고. 모든 고객을 업데이 트하려는 경우 대신 스칼라 = 연산자의 조인을 사용. 당신은 그렇게하기 위해 저장 항목에 "연결"고객에게 조건이 필요합니다.

    같은 store_key 모든 고객 ID를 업데이트 할 경우 쿼리가 하나의 행을 반환되도록 원격으로 실행 SELECT에 WHERE 절을 제공해야합니다.

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

    5.쿼리에 의해 생성 된 결과는 같은 쿼리에 유효한 핸들러를 제공하는 경우 해결 될 수있는이 문제를 처리하는 적절한 필요 행 전혀 필요하지 않습니다 쿼리를 제한 1. 하나 개의 행을 반환 2.이 또한 하나의 행을 반환 할 것 "최대 (열)을 선택"제공하여 수행 할 수 있습니다

    쿼리에 의해 생성 된 결과는 같은 쿼리에 유효한 핸들러를 제공하는 경우 해결 될 수있는이 문제를 처리하는 적절한 필요 행 전혀 필요하지 않습니다 쿼리를 제한 1. 하나 개의 행을 반환 2.이 또한 하나의 행을 반환 할 것 "최대 (열)을 선택"제공하여 수행 할 수 있습니다

  6. from https://stackoverflow.com/questions/21048955/postgres-error-more-than-one-row-returned-by-a-subquery-used-as-an-expression by cc-by-sa and MIT license