Oracle

2009-02-02 30 views
23

ben böyle bir şey yapmak istiyorum satırlar Çoklu Değerler üzerinde Eşleştirme silin. Bu doğru mu? Bunun mümkün olması gibi bir sorgu gibi görünüyor. nerede fıkrada Terimlerinizin etrafındaOracle

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

cevap

41

Hayır, sadece parantez gerekir. Şerefe!

+0

Yani bu aslında yanıltıcı ve nasıl derinden olmayan için esasen yanlış iddia ediyorum sezgisel. Satıcınız boş değer IN içeriyorsa çalışmıyor. Hangi, sanırım, nullların nasıl olduğu konusunda mantıklıdır, ancak, örneğin, eksi nasıl çalıştığıyla tamamen tutarsızdır. –

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

koyun parens:

2

sözdizimi aşağıda SQLServer çalışır ama standart sql ama Açıklamalarda belirttiği şekilde bu sigara standart uygulaması ve şu anda Oracle desteklenmemektedir inanıyoruz.

Ben

Oracle'de
delete s 
from 
    student s 
    inner join schedule sch 
    on s.course=sch.course 
    and s.major = sch.major 
+0

Hayır, standart SQL DELETE'de yalnızca bir tabloyu destekler. MySQL ve Microsoft SQL Server standart bir uzantısı olarak çoklu tablo DELETE desteği, ancak Oracle değil. –

+0

Bir tablonun SQL standart konsepti kesinlikle bir tabloyla sınırlı değildir. Genellikle görüş içerir. Bazı görüşler güncellenebilir ve genişletilebilir. –

+0

Yorumlar için teşekkürler, DB uygulamalarındaki farklar hakkında bilgi edinmek iyidir. Cevabımı – kristof

3

, bir bir in-line görünümünden silmek yapabilirsiniz başvurmak için bırakacaktır, fakat genel tablodan bir satır olmasını sağlar yabancı anahtar ihtiyacı olan satır silinir, görünümde birden fazla satır tarafından temsil edilemez. Özelliklerin herhangi biri boş ise, satır en İÇİNDE değil kabul

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

Ayrıca EXISTS deyimi kullanabilirsiniz. Yani, eğer dersler eşitse ve hem öğrenci hem de program büyüklüğü boşsa, satır silinmeyecektir.

bir özellik, bu tür büyük olarak, boş olabilir ve null = null gerçek olamayacak kadar, denemek isterseniz:

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

+1; WHERE EXISTS, IN – Brian

+1

@ Brian'ın kullanımından çok daha iyi bir mekanizmadır: (Senin yorumuna biraz geç cevap veriyorum!) Neden EXISTS IN'den daha iyi? –

+1

Çok güzel bir soru. Benim anlayışım, performans açısından iyi bir seçimdir, ancak kanıt açısından sunacağım çok az şey var. Bunu şöyle buldum: http://www.techrepublic.com/article/oracle-tip-understand-the-difference-between-in-and-exists-in-subqueries/5297080 – Brian

3

Not:

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);