Oracle에서 내부 Join을 사용하여 문
MySQL에서 정상적으로 동작하는 쿼리가 있는데 Oracle에서 실행하면 다음과 같은 오류가 발생합니다.
SQL 오류: ORA-00933:SQL 명령이 올바르게 종료되지 않음
00933. 00000 - "SQL 명령이 올바르게 종료되지 않았습니다"
쿼리는 다음과 같습니다.
UPDATE table1
INNER JOIN table2 ON table1.value = table2.DESC
SET table1.value = table2.CODE
WHERE table1.UPDATETYPE='blah';
이 구문은 Oracle에서 사용할 수 없습니다.다음과 같이 할 수 있습니다.
UPDATE table1 SET table1.value = (SELECT table2.CODE
FROM table2
WHERE table1.value = table2.DESC)
WHERE table1.UPDATETYPE='blah'
AND EXISTS (SELECT table2.CODE
FROM table2
WHERE table1.value = table2.DESC);
또는 다음과 같이 할 수 있습니다.
UPDATE
(SELECT table1.value as OLD, table2.CODE as NEW
FROM table1
INNER JOIN table2
ON table1.value = table2.DESC
WHERE table1.UPDATETYPE='blah'
) t
SET t.OLD = t.NEW
인라인 뷰가 Oracle에 의해 갱신 가능한 것으로 간주되는지 여부에 따라 달라집니다(두 번째 스테이트먼트의 갱신 가능 여부는 여기에 기재되어 있는 몇 가지 규칙에 따라 달라집니다.
사용방법:
MERGE
INTO table1 trg
USING (
SELECT t1.rowid AS rid, t2.code
FROM table1 t1
JOIN table2 t2
ON table1.value = table2.DESC
WHERE table1.UPDATETYPE='blah'
) src
ON (trg.rowid = src.rid)
WHEN MATCHED THEN UPDATE
SET trg.value = code;
MERGE
와 함께WHERE
절:
MERGE into table1
USING table2
ON (table1.id = table2.id)
WHEN MATCHED THEN UPDATE SET table1.startdate = table2.start_date
WHERE table1.startdate > table2.start_date;
필요한 것은WHERE
clause columns가 참조되고 있기 때문에ON
절을 업데이트할 수 없습니다.
위의 답변 중 일부를 사용하지 마십시오.
네스트된 SELECT를 사용할 것을 제안하는 사람도 있습니다.그렇게 하지 마세요.너무 느려요업데이트할 레코드가 많은 경우 다음과 같이 join을 사용합니다.
update (select bonus
from employee_bonus b
inner join employees e on b.employee_id = e.employee_id
where e.bonus_eligible = 'N') t
set t.bonus = 0;
자세한 내용은 이 링크를 참조하십시오.http://geekswithblogs.net/WillSmith/archive/2008/06/18/oracle-update-with-join-again.aspx 를 참조해 주세요.
또, 참가하고 있는 모든 테이블에 프라이머리 키가 있는 것을 확인합니다.
UPDATE ( SELECT t1.value, t2.CODE
FROM table1 t1
INNER JOIN table2 t2 ON t1.Value = t2.DESC
WHERE t1.UPDATETYPE='blah')
SET t1.Value= t2.CODE
여기에 나타나 있듯이 Tony Andrews가 제안한 첫 번째 솔루션의 일반적인 구문은 다음과 같습니다.
update some_table s
set (s.col1, s.col2) = (select x.col1, x.col2
from other_table x
where x.key_value = s.key_value
)
where exists (select 1
from other_table x
where x.key_value = s.key_value
)
여러 필드를 업데이트하려는 경우 특히 흥미롭다고 생각합니다.
그것은 훌륭한 신탁이 된다.
merge into table1 t1
using (select * from table2) t2
on (t1.empid = t2.empid)
when matched then update set t1.salary = t2.salary
이 구문은 나에게 효과가 있다.
UPDATE
(SELECT A.utl_id,
b.utl1_id
FROM trb_pi_joint A
JOIN trb_tpr B
ON A.tp_id=B.tp_id Where A.pij_type=2 and a.utl_id is null
)
SET utl_id=utl1_id;
table2의 description 대신 description을 사용하여
update
table1
set
value = (select code from table2 where description = table1.value)
where
exists (select 1 from table2 where description = table1.value)
and
table1.updatetype = 'blah'
;
UPDATE table1 t1
SET t1.value =
(select t2.CODE from table2 t2
where t1.value = t2.DESC)
WHERE t1.UPDATETYPE='blah';
UPDATE (SELECT T.FIELD A, S.FIELD B
FROM TABLE_T T INNER JOIN TABLE_S S
ON T.ID = S.ID)
SET B = A;
A와 B는 에일리어스 필드이므로 테이블을 가리킬 필요는 없습니다.
UPDATE IP_ADMISSION_REQUEST ip1
SET IP1.WRIST_BAND_PRINT_STATUS=0
WHERE IP1.IP_ADM_REQ_ID =
(SELECT IP.IP_ADM_REQ_ID
FROM IP_ADMISSION_REQUEST ip
INNER JOIN VISIT v
ON ip.ip_visit_id=v.visit_id
AND v.pat_id =3702
); `enter code here`
또한 Oracle을 언급하고 있기 때문에 다음과 같은 작업을 수행할 수 있습니다.
declare
begin
for sel in (
select table2.code, table2.desc
from table1
join table2 on table1.value = table2.desc
where table1.updatetype = 'blah'
) loop
update table1
set table1.value = sel.code
where table1.updatetype = 'blah' and table1.value = sel.desc;
end loop;
end;
/
Oracle Base는 이 문제를 잘 파악하고 있습니다.
https://oracle-base.com/articles/misc/updates-based-on-queries
이 링크에서 - 위의 쿼리를 수정했지만 나에게는 작동하지 않았습니다(rowid를 사용하는 mathguy의 답변).
MERGE /*+ APPEND PARALLEL(8) */ INTO dest_table tt
USING source_table st
ON (tt.identifier = st.identifier)
WHEN MATCHED THEN
UPDATE SET tt.number = st.number;
여기 두 개의 테이블이 있습니다. 소스 테이블과 대상 테이블입니다.둘 다 varchar 필드가 공통으로 있어 Source Identify Field(PK; 소스 식별 필드)를 수신인 테이블에 추가합니다.
update table1 a
set a.col1='Y'
where exists(select 1
from table2 b
where a.col1=b.col1
and a.col2=b.col2
)
언급URL : https://stackoverflow.com/questions/2446764/update-statement-with-inner-join-on-oracle
'programing' 카테고리의 다른 글
log4j:WARN web.xml에서 로거용 부록을 찾을 수 없습니다. (0) | 2023.03.26 |
---|---|
comet/server push iframe을 로드하는 동안 브라우저 "throuber of doom"을 중지합니다. (0) | 2023.03.26 |
JavaScriptSerializer에서 null/default 값을 가진 속성을 제외할 수 있습니까? (0) | 2023.03.26 |
Woocommerce는 각 카테고리와 제품을 보여줍니다. (0) | 2023.03.26 |
JSON 값 1 또는 0 - int 또는 boolean (0) | 2023.03.26 |