Hoe kan ik verwijderen met INNER JOIN met SQL Server?

Ik wil verwijderen met INNER JOINin SQL Server 2008.

Maar ik krijg deze foutmelding:

Bericht 156, niveau 15, staat 1, regel 15
Onjuiste syntaxis bij het zoekwoord ‘INNER’.

Mijn code:

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

Antwoord 1, autoriteit 100%

U moet aangeven uit welke tabel u wilt verwijderen. Hier is een versie met een alias:

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

Antwoord 2, autoriteit 7%

Voeg gewoon de naam van de tabel toe tussen DELETEen FROMvan waaruit u records wilt verwijderen, omdat we de tabel moeten specificeren die moet worden verwijderd. Verwijder ook de ORDER BY-clausule omdat er niets te bestellen is tijdens het verwijderen van records.

Dus uw laatste vraag zou als volgt moeten zijn:

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

Antwoord 3

Het is mogelijk dat dit nuttig voor u is –

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

Of probeer dit –

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

Antwoord 4

Probeer dit:

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

Antwoord 5

Het zou moeten zijn:

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

Antwoord 6

In SQL Server Management Studiokan ik eenvoudig een SELECTvraag:

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

Ik kan het uitvoeren en al mijn contacten worden weergegeven.

Verander nu de SELECTin een DELETE:

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

Alle records die u in de SELECT-instructie hebt gezien, worden verwijderd.

Je kunt met dezelfde procedure zelfs een moeilijkere inner join maken, bijvoorbeeld:

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

Antwoord 7

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

Antwoord 8

Deze versie zou moeten werken:

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

Antwoord 9

Probeer deze zoekopdracht:

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

Antwoord 10

Een andere manier is het gebruik van 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

Opmerking:we kunnen JOINniet gebruiken binnen CTEals je wilt delete.


Antwoord 11

Dit is wat ik momenteel gebruik om te verwijderen of zelfs te updaten:

DELETE           w
FROM             WorkRecord2   w,
                 Employee      e
WHERE            w.EmployeeRun = e.EmployeeNo
             AND w.Company = '1' 
             AND w.Date = '2013-05-06'

Antwoord 12

Je geeft de tabellen voor Companyen Dateniet op, en misschien wil je dat oplossen.

Standaard SQL met MERGE:

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

Het antwoord van Devartis ook standaardSQL, hoewel onvolledig. Het zou er ongeveer zo uit moeten zien:

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

Het belangrijkste om op te merken over het bovenstaande is dat het duidelijk is dat de verwijdering gericht is op een enkele tabel, zoals in het tweede voorbeeld wordt afgedwongen door een scalaire subquery te vereisen.

Voor mij zijn de verschillende eigen syntaxisantwoorden moeilijker te lezen en te begrijpen. Ik denk dat de mentaliteit voor het best wordt beschreven in het antwoord van frans eilering, dat wil zeggen dat de persoon die de code schrijft niet per se om de persoon geeft die de code zal lezen en onderhouden.


Antwoord 13

Hier is mijn SQL Server-versie

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)

Antwoord 14

Dit is een eenvoudige vraag om de records uit twee tabellen tegelijk te verwijderen.

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

Antwoord 15

Je zou zelfs een subquery kunnen doen. Like deze code hieronder:

DELETE FROM users WHERE id IN(
    SELECT user_id FROM Employee WHERE Company = '1' AND Date = '2013-05-06'
)

Other episodes