SQL Server ile INNER JOIN kullanarak nasıl silinir?


1283

Ben kullanarak silmek istediğiniz INNER JOINyer SQL Server 2008 .

Ama bu hatayı alıyorum:

Msg 156, Seviye 15, Durum 1, Satır 15
'INNER' anahtar kelimesinin yanında yanlış sözdizimi.

Kodum:

DELETE FROM WorkRecord2 
INNER JOIN Employee ON EmployeeRun=EmployeeNo
WHERE Company = '1' AND Date = '2013-05-06'

2
Belgelerdeki C örneği DELETE, bir birleştirme ile nasıl kullanılacağını gösterir
Pondlife

1
Örnek C, bir imleç ve bir sürü yabancı şey de kullanıyor
reggaeguitar

T1.id = t2.id üzerindeki table1 t1 iç birleşim table2 t2'den table1'den silme; detaylı olarak youtu.be/_tyUVrS2iH4
Amresh Kumar Singh

Yanıtlar:


2241

Hangi tablodan sildiğinizi belirtmeniz gerekiyor, işte takma adı olan bir sürüm:

DELETE w
FROM WorkRecord2 w
INNER JOIN Employee e
  ON EmployeeRun=EmployeeNo
WHERE Company = '1' AND Date = '2013-05-06'

9
@bluefeet SQL Server için her iki tablodan da silmek üzere doğru sözdizimini sağlayabilir misiniz?
oabarca

44
@ user2070775 SQL Server'da 2 tablodan silmek için 2 ayrı ifade kullanmanız gerekir.
Taryn


1
@MathieuRodic paylaştığınız için teşekkürler. Kurulumumda 2 tablodan ayrı ayrı silersem, artık 2. tablodan hangi satırları sileceğinizi bilmiyorum, bu yüzden bu yardımcı olacaktır :)
Verena Haunschmid

2
@ShahryarSaljoughi, WorkRecord2 tablosunun diğer adıdır.
Taryn

151

Silinecek tabloyu belirtmemiz gerektiğinden, kayıtları silmek istediğiniz yere DELETEve arasına tablonun adını eklemeniz FROMyeterlidir. ORDER BYKayıtları silerken sipariş edilecek hiçbir şey olmadığı için yan tümcesi de kaldırın .

Yani son sorgunuz şöyle olmalıdır:

    DELETE WorkRecord2 
      FROM WorkRecord2 
INNER JOIN Employee 
        ON EmployeeRun=EmployeeNo
     WHERE Company = '1' 
       AND Date = '2013-05-06';

3
Yalnızca ilk tablodan silmek istiyorsanız bu SQL Server üzerinde çalışır.
TroySteven

1
@matwonk: İkinci tablonun adını kullanırsanız, ikinci tablodan silebilirsiniz. Örneğin, DELETE Employeekullanım tablo yerine Çalışan tablosundan silinir WorkRecord2.
hims056

1
@matwonk: İşte bir örnek: 1) İlk tablodan silme 2) İkinci tablodan silme .
hims056

30

Bu sizin için yararlı olabilir -

DELETE FROM dbo.WorkRecord2 
WHERE EmployeeRun IN (
    SELECT e.EmployeeNo
    FROM dbo.Employee e
    WHERE ...
)

Veya şunu deneyin -

DELETE FROM dbo.WorkRecord2 
WHERE EXISTS(
    SELECT 1
    FROM dbo.Employee e
    WHERE EmployeeRun = e.EmployeeNo
        AND ....
)

1
Sql Server üzerinde çalışan tek cevap budur. Sorgunuzu yalnızca ID'yi seçin ... katılın ... katılın vb. Gibi bir sorgu oluşturun ve ardından bir alt sorgu olarak sarın ve (tablo) 'dan bir id yapın (alt sorgu)
Chris Moschini

28

Bunu dene:

DELETE FROM WorkRecord2 
       FROM Employee 
Where EmployeeRun=EmployeeNo
      And Company = '1' 
      AND Date = '2013-05-06'

16

Olmalı:

DELETE zpost 
FROM zpost 
INNER JOIN zcomment ON (zpost.zpostid = zcomment.zpostid)
WHERE zcomment.icomment = "first"       

11

Bu sürüm çalışmalıdır

DELETE WorkRecord2
FROM WorkRecord2 
INNER JOIN Employee ON EmployeeRun=EmployeeNo
Where Company = '1' AND Date = '2013-05-06'

11

SQL Server Management Studio'da kolayca bir SELECTsorgu oluşturabilirim .

SELECT Contact.Naam_Contactpersoon, Bedrijf.BedrijfsNaam, Bedrijf.Adres, Bedrijf.Postcode
FROM Contact
INNER JOIN Bedrijf ON Bedrijf.IDBedrijf = Contact.IDbedrijf

Yürütebilirim ve tüm kişilerim gösterilir.

Şimdi değiştirmek SELECTbir için DELETE:

DELETE Contact
FROM Contact
INNER JOIN Bedrijf ON Bedrijf.IDBedrijf = Contact.IDbedrijf

İfadede gördüğünüz tüm kayıtlar SELECTkaldırılacaktır.

Aynı prosedürle daha zor bir iç birleşim bile oluşturabilirsiniz, örneğin:

DELETE FROM Contact
INNER JOIN Bedrijf ON Bedrijf.IDBedrijf = Contact.IDbedrijf
INNER JOIN LoginBedrijf ON Bedrijf.IDLoginBedrijf = LoginBedrijf.IDLoginBedrijf

10
 DELETE a FROM WorkRecord2 a 
       INNER JOIN Employee b 
       ON a.EmployeeRun = b.EmployeeNo 
       Where a.Company = '1' 
       AND a.Date = '2013-05-06'

9

Bu sorguyu deneyin:

DELETE WorkRecord2, Employee 
FROM WorkRecord2 
INNER JOIN Employee ON (tbl_name.EmployeeRun=tbl_name.EmployeeNo)
WHERE tbl_name.Company = '1' 
AND tbl_name.Date = '2013-05-06';

8
Eminim bir DELETE sadece bir tablo belirtebilirsiniz. Bu benim için işe yaramıyor.
Stealth Haham

3
MySQL, ancak SQL Server (soru sorar) silmek için birden çok tablo belirtebilirsiniz inanıyorum.
dandev91

7

Kullanmanın başka bir yolu CTE.

;WITH cte 
     AS (SELECT * 
         FROM   workrecord2 w 
         WHERE  EXISTS (SELECT 1 
                        FROM   employee e 
                        WHERE  employeerun = employeeno 
                               AND company = '1' 
                               AND date = '2013-05-06')) 
DELETE FROM cte 

Not: İstediğiniz zaman JOINiçeride kullanamayız .CTEdelete


6

Bu, bir kerede iki tablodan kayıtları silmek için basit bir sorgudur.

DELETE table1.* ,
       table2.* 
FROM table1 
INNER JOIN table2 ON table1.id= table2.id where table1.id ='given_id'

2
Bu soru SQL Server içindir. SQL Server'da bir deyimde iki tablodan silemezsiniz. Benim anlayış şudur olabilir mysql ve MS Access yapılabilir.
Darren Griffith

6

Bunu deneyin, yardımcı olabilir

 DELETE WorkRecord2 
          FROM WorkRecord2 
    INNER JOIN Employee 
            ON EmployeeRun=EmployeeNo
         WHERE Company = '1' 
           AND Date = '2013-05-06';

7
Kabul edilen cevaptan farkı nedir : stackoverflow.com/questions/16481379/… ?
varsayılan yerel ayar

3
Bu cevap, örtüşme yerine açık tablo adlandırma kullanır, bu da olup biteni okuma / yakalama konusunda daha az deneyimli olanlar için daha kolay hale getirir.
Joshua Burns

1
@JoshuaBurns: Hala tam bir yinelenen Cevabıma .
hims056

4

İşte benim SQL Server sürümüm

DECLARE @ProfileId table(Id bigint)

DELETE FROM AspNetUsers
OUTPUT deleted.ProfileId INTO @ProfileId
WHERE Email = @email

DELETE FROM UserProfiles    
WHERE Id = (Select Id FROM @ProfileId)

4

Tablolarına aşağıdakiler için belirtmeyen CompanyveDate bunu düzeltmek isteyebilirsiniz.

Standart SQL kullanımı MERGE:

MERGE WorkRecord2 T
   USING Employee S
      ON T.EmployeeRun = S.EmployeeNo
         AND Company = '1'
         AND Date = '2013-05-06'
WHEN MATCHED THEN DELETE;

@Devart'ın cevabı da eksik olsa da Standart SQL'dir, daha çok şöyle görünmelidir:

DELETE 
  FROM WorkRecord2
  WHERE EXISTS ( SELECT *
                   FROM Employee S
                  WHERE S.EmployeeNo = WorkRecord2.EmployeeRun
                        AND Company = '1'
                        AND Date = '2013-05-06' );

Yukarıdakiler hakkında dikkat edilmesi gereken önemli nokta, silme işleminin, ikinci örnekte uygulandığı gibi, bir skaler alt sorgu gerektirerek tek bir tabloyu hedeflediği açıktır.

Benim için çeşitli özel sözdizimi cevaplarını okumak ve anlamak daha zordur. Zihniyet için en iyi cevap @frans eilering tarafından açıklanmıştır yani kod yazan kişi mutlaka kodu okuyacak ve koruyacak kişi umurumda değil.


4

Şu anda silmek veya hatta güncellemek için kullandığım şey:

DELETE           w
FROM             WorkRecord2   w,
                 Employee      e
WHERE            w.EmployeeRun = e.EmployeeNo
             AND w.Company = '1' 
             AND w.Date = '2013-05-06'
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.