2014-05-11 4 views
1

Oracle SQL에서 상관 하위 쿼리의 NOT EXISTS 조건을 기반으로 쉽게 업데이트 할 수 있습니다. 이 기능은 다른 쿼리 나 ID 목록을 기반으로하는 업데이트에 유용합니다.Postgres : NOT EXISTS가있는 상관 하위 쿼리

서브 쿼리의 메커니즘은 Postgres에서 다릅니다 ... 어떻게 동일한 목표를 달성 할 수 있습니까? http://sqlfiddle.com/#!1/1dbb8/55

는 오라클에 그것을 할 것입니다 방법

UPDATE UserInfo a 
SET a.username = 'not found' 
WHERE NOT EXISTS (SELECT 'X' 
       FROM UserOrder b 
       WHERE b.userid = a.userid) 
AND a.userid in (1,2,3); 

포스트 그레스는 NOT 쿼리를 EXISTS :이

SELECT u.userid, u.username 
FROM UserInfo AS u 
WHERE NOT EXISTS 
    (SELECT * 
    FROM UserOrder AS o 
    WHERE o.userid = u.userid 
); 

포스트 그레스는 NOT 갱신 EXISTS 작동합니다 작동하지 않습니다

UPDATE UserInfo 
SET username = 'not found' 
FROM (SELECT u.userid 
    FROM UserInfo AS u 
    WHERE NOT EXISTS 
     (SELECT * 
     FROM UserOrder AS o 
     WHERE o.userid = u.userid 
     )) em 
WHERE em.userid = UserInfo.userid; 
+0

왼쪽 안티 - 조인의 왼쪽을 업데이트 하시겠습니까? Pg에서는이 작업을 수행 할 수 있지만 불행하게도 왼쪽에 자체 조인이 필요합니다 (예 : 't1을 왼쪽 외부 조인 ... on ... ... t.id = t1.id'로 업데이트합니다. 왜냐하면 내부 조인 (impicit, update를 통해 ... from')를 업데이트 대상 테이블에 대해 적용합니다. –

+2

주어진 솔루션이 작동합니다. 이 [업데이트 된 바이올린] (http://sqlfiddle.com/#!1/1dbb8/75)을 고려하십시오. –

답변

2

Sqlfiddle은 "스크립트 실행"할 때마다 db 내용을 다시 생성합니다. 업데이트와 동일한 스크립트에서 select를 실행하십시오.

sqlfiddle의 Oracle 쿼리는 거의 작동하지만 userid 매개 변수의 별명을 잊어 버렸습니다. 올바른 쿼리 :

/* How you would do it on Oracle */ 
UPDATE UserInfo 
SET username = 'not found' 
WHERE NOT EXISTS (SELECT 'X' 
        FROM UserOrder b 
        WHERE b.userid = userinfo.userid); 
2

update을 원래 선택보다 더 복잡하게 만드는 이유는 무엇입니까? 이 코드는 포스트 그레스와 Oracle 모두에서 작동합니다 :

UPDATE UserInfo ui 
    SET username = 'not found' 
    WHERE NOT EXISTS (SELECT 'X' 
        FROM UserOrder uo 
        WHERE uo.userid = ui.userid 
        ) AND 
     ui.userid in (1,2,3); 

문제는 SET ui.username입니다. Postgres는 set 절에 테이블 별칭을 허용하지 않습니다 (한 번에 하나의 테이블 만 업데이트 할 수 있기 때문에).

상관 관계 중첩 된 쿼리를 중첩하는 데 "문제"가 있습니다. 일부 데이터베이스에서는 작동하지만 다른 데이터베이스에서는 작동하지 않습니다. SQL Server에서 작동하며 MySQL 및 Oracle에서는 작동하지 않습니다. Postgres에서도 작동하지 않는다고 생각합니다.

+0

그건 내가 생각했을거야,하지만이 SQL은 0 행을 업데이 트합니다. 내가 의미하는 바를 SQLfiddle에서 시험해보십시오. – ardochhigh

+1

@ardochhigh. . . SQL Fiddle에서 시도해 보면 작동합니다. 여기에서 볼 수 있습니다 : http://sqlfiddle.com/#!1/b36ae/1. –

2
UPDATE UserInfo a 
SET username = 'not found' 
WHERE NOT EXISTS (
     SELECT 'X' 
     FROM UserOrder b 
     WHERE b.userid = a.userid 
    ) 
AND a.userid in (1,2,3) 
    ; 

분명히 Postgres에서 작동해야합니다.

+0

죄송합니다. SQL 피들에서도 작동하지 않습니다. – ardochhigh