2012-11-19 21 views
11

Bunu yayınlamakta gerçekten isteksiz davrandım çünkü bu yaygın bir sorun olduğunu düşünüyorum, ancak bu durum için geçerli bir yanıt bulamıyorum ... (belki de sadece gerçekten kötü bir googler).Başka bir tablodan bileşik anahtar temel alınarak silme

İki aynı tabloya (sütun bilgisi değil, veri), tablo1 ve tablo2'ye sahibim. Kompozit anahtarın (col1, col2) her iki tabloda da var olduğu tablo1'deki kayıtları silmek istiyorum. İşte sahip olduğum şey, bana göre doğru görünüyor ama bir hata atıyor.

DELETE FROM Table1 
WHERE (**Col1**, Col2) IN 
(SELECT Col1, Col2 
FROM Table1 a 
JOIN Table2 b 
    ON a.Col1 = b.Col1 
    AND a.Col2 = b.Col2) 

Hata:

Ben 'Kırmızı hata Squiggles' vardır kod kısmına yaklaşık iki * koyduk

Msg 4145, Level 15, State 1, Line 212 An expression of non-boolean type specified in a context where a condition is expected, near ','.

.

+0

Bunun SQL-SERVER olduğuna inanıyorum? – gdoron

+0

Evet, pardon. Daha spesifik olmalıydı. İşte işte SQL-SERVER'i SQL ve Oracle olarak Oracle olarak görüyoruz. – Jeff

+0

Oracle, SQL Server'dan çok daha büyük bir "eski" olduğu için, garip bir sözleşme ... ama eğer patronunuzu mutlu ediyorsa ve daha zengin olursanız, neden olmasın? – gdoron

cevap

18

Bu olabilir temiz ile JOIN kullanılarak gerçekleştirilir senin DELETE: DBMS öyle

DELETE a 
FROM 
    Table1 a 
    JOIN Table2 b 
     ON a.Col1 = b.Col1 
     AND a.Col2 = b.Col2 
+0

Bu çözüm işe yarıyor, ancak umarım benim neden işe yaramamış olursun. '(Col1, col2)' sözdizimini kullanan benzer problemlere çözümler gördüm. – Jeff

+0

@Jeff, Oracle için geçerli, ancak Sql Server için değil ... Sql'nin biraz farklı lehçelerini kullanıyorlar ve her zaman birbirinin yerine geçemezler. –

+0

Bu mantıklı. Yemin edebilirim SQL-Server'da bu sözdizimini bir noktada kullandım, ama muhtemelen yanıldım. Sözdizimini SQL-Server, MySQL ve Oracle arasında düz tutmaya çalışmak karışıklık. Teşekkürler! – Jeff

7

? Eğer sözlü olarak ise o zaman çift yönlü karşılaştırma çalışması gerekir.

DELETE FROM Table1 
WHERE (Col1, Col2) IN 
(SELECT Col1, Col2 
FROM Table2) 

Eğer SQL server ise, o zaman Michael'ın çözümü çalışmalıdır.

+0

Bu, aynı zamanda HSQLDB'de de çalışır: 'tablo1'den sil (col1, col2, col3) 'de (col1, col2, col3, someview123' den nerede ...) – binwiederhier

İlgili konular