Oracle Delete Rows Matching On Multiple Values

前端 未结 6 1088
暖寄归人
暖寄归人 2020-12-24 01:58

I want to do something like:

DELETE FROM student WHERE
student.course, student.major IN
(SELECT schedule.course, schedule.major FROM schedule)
相关标签:
6条回答
  • 2020-12-24 02:35

    In Oracle, you can do a delete from an in-line view, but it generally needs a foreign key that ensures that a row from the table from which the row is deleted cannot be represented by more than one row in the view.

    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);
    
    0 讨论(0)
  • 2020-12-24 02:37

    Note that if any attributes are null, the row's considered not IN. That is, if courses are equal and both student and schedule major are null, row will not be deleted.

    If an attribute, such as major, may be null, and you want null = null to be true, try:

    DELETE
    FROM student
    WHERE (student.course, NVL(student.major,'sOmeStRinG') )
    IN (SELECT schedule.course, NVL(schedule.major,'sOmeStRinG') FROM schedule)
    
    0 讨论(0)
  • 2020-12-24 02:40
    DELETE FROM student WHERE
    (student.course, student.major) IN
    (SELECT schedule.course, schedule.major FROM schedule)
    

    Put parens around your terms in the where clause. Cheers!

    0 讨论(0)
  • 2020-12-24 02:46

    The syntax below works in SQLServer but I believe it is a standard sql but as pointed out in comments this is non standard implementation and is not currently supported in Oracle.

    I will leave it for reference

    delete s
    from 
        student s 
        inner join schedule sch
        on s.course=sch.course 
        and s.major = sch.major
    
    0 讨论(0)
  • 2020-12-24 02:48

    You could also use the EXISTS clause:

    DELETE FROM student WHERE
    EXISTS
    (
      SELECT 1 FROM schedule 
      WHERE schedule.course=student.course 
      AND schedule.major=student.major
    )
    
    0 讨论(0)
  • 2020-12-24 02:49

    No, you just need parentheses:

    DELETE FROM student WHERE
    (student.course, student.major) IN
    (SELECT schedule.course, schedule.major FROM schedule)
    
    0 讨论(0)
提交回复
热议问题