[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 행이 반환되는 것을 보장하기 위해 하위 쿼리에 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.이것은 당신의 중첩 된 SELECT 반환에게 하나 개 이상의 행을 의미합니다.
이것은 당신의 중첩 된 SELECT 반환에게 하나 개 이상의 행을 의미합니다.
당신은에 적절한 WHERE 절을 추가해야합니다.
-
==============================
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.이 오류 수단은 저장 쿼리에서 SELECT store_key는 SERVER1 데이터베이스에 두 개 이상의 행을 반환했다고. 모든 고객을 업데이 트하려는 경우 대신 스칼라 = 연산자의 조인을 사용. 당신은 그렇게하기 위해 저장 항목에 "연결"고객에게 조건이 필요합니다.
이 오류 수단은 저장 쿼리에서 SELECT store_key는 SERVER1 데이터베이스에 두 개 이상의 행을 반환했다고. 모든 고객을 업데이 트하려는 경우 대신 스칼라 = 연산자의 조인을 사용. 당신은 그렇게하기 위해 저장 항목에 "연결"고객에게 조건이 필요합니다.
같은 store_key 모든 고객 ID를 업데이트 할 경우 쿼리가 하나의 행을 반환되도록 원격으로 실행 SELECT에 WHERE 절을 제공해야합니다.
-
==============================
5.쿼리에 의해 생성 된 결과는 같은 쿼리에 유효한 핸들러를 제공하는 경우 해결 될 수있는이 문제를 처리하는 적절한 필요 행 전혀 필요하지 않습니다 쿼리를 제한 1. 하나 개의 행을 반환 2.이 또한 하나의 행을 반환 할 것 "최대 (열)을 선택"제공하여 수행 할 수 있습니다
쿼리에 의해 생성 된 결과는 같은 쿼리에 유효한 핸들러를 제공하는 경우 해결 될 수있는이 문제를 처리하는 적절한 필요 행 전혀 필요하지 않습니다 쿼리를 제한 1. 하나 개의 행을 반환 2.이 또한 하나의 행을 반환 할 것 "최대 (열)을 선택"제공하여 수행 할 수 있습니다
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
'SQL' 카테고리의 다른 글
[SQL] T-SQL에 중괄호 (0) | 2020.05.23 |
---|---|
[SQL] SQL 서버에서 다른 저장 프로 시저 저장 프로 시저를 실행 (0) | 2020.05.23 |
[SQL] MySQL은 / SQL 텍스트 필드의 처음 40 개 문자를 검색? (0) | 2020.05.23 |
[SQL] 날짜에서 시간을 제거하는 방법 (0) | 2020.05.23 |
[SQL] 하위 쿼리와 SQL의 UPDATE 그 참조 MySQL은 같은 테이블 (0) | 2020.05.23 |