programing

여러 값에 일치하는 Oracle 행 삭제

yellowcard 2023. 6. 19. 21:21
반응형

여러 값에 일치하는 Oracle 행 삭제

다음과 같은 작업을 수행하고 싶습니다.

DELETE FROM student WHERE
student.course, student.major IN
(SELECT schedule.course, schedule.major FROM schedule)

그러나 IN 연산자에는 하나의 열만 사용할 수 있는 것 같습니다.진짜예요?이런 질문이 가능할 것 같습니다.

아니요, 괄호만 있으면 됩니다.

DELETE FROM student WHERE
(student.course, student.major) IN
(SELECT schedule.course, schedule.major FROM schedule)

다음과 같이 EXISTES 절을 사용할 수도 있습니다.

DELETE FROM student WHERE
EXISTS
(
  SELECT 1 FROM schedule 
  WHERE schedule.course=student.course 
  AND schedule.major=student.major
)
DELETE FROM student WHERE
(student.course, student.major) IN
(SELECT schedule.course, schedule.major FROM schedule)

where 절에서 용어 주위에 괄호를 두르세요.건배!

Oracle에서는 인라인 보기에서 삭제를 수행할 수 있지만 일반적으로 행이 삭제된 테이블의 행을 보기에서 둘 이상의 행으로 표시할 수 없도록 하는 외부 키가 필요합니다.

create table parent (id number primary key);
create table child (id number primary key, parent_id number references parent);
insert into parent values(1);
insert into child values(2,1);
delete from (select * from parent p, child c where c.parent_id = p.id);

특성이 null인 경우 행은 IN이 아닌 것으로 간주됩니다.즉, 과정이 같고 학생 및 스케줄 전공이 모두 null인 경우 행은 삭제되지 않습니다.

major와 같은 속성이 null일 수 있고 null = null을 참으로 만들려면 다음을 시도합니다.

DELETE
FROM student
WHERE (student.course, NVL(student.major,'sOmeStRinG') )
IN (SELECT schedule.course, NVL(schedule.major,'sOmeStRinG') FROM schedule)

아래 구문은 SQL Server에서 작동합니다. 하지만 나는 그것이 표준 sql이라고 믿습니다. 그러나 코멘트에서 지적했듯이 이는 비표준 구현이며 현재 Oracle에서 지원되지 않습니다.

참고로 남겨 두겠습니다.

delete s
from 
    student s 
    inner join schedule sch
    on s.course=sch.course 
    and s.major = sch.major

언급URL : https://stackoverflow.com/questions/504060/oracle-delete-rows-matching-on-multiple-values

반응형