Vreau să o ștergeți folosind INNER JOIN
în SQL Server 2008.
Dar primesc eroarea asta:
Msg 156, Nivel 15, Stat 1, Linia 15 sintaxă Incorectă apropierea de cuvinte cheie 'INTERIOR'.
Codul meu:
DELETE FROM WorkRecord2
INNER JOIN Employee ON EmployeeRun=EmployeeNo
WHERE Company = '1' AND Date = '2013-05-06'
Trebuie să specificați ce masa s-o ștergeți de aici este o versiune cu un alias:
DELETE w
FROM WorkRecord2 w
INNER JOIN Employee e
ON EmployeeRun=EmployeeNo
WHERE Company = '1' AND Date = '2013-05-06'
Trebuie doar să adăugați numele de masă între "ȘTERGE" și "DE la" din care doriți să ștergeți înregistrările pentru că trebuie să specificați în tabel pentru a șterge. Elimina, de asemenea, "ORDINUL PRIN" clauza pentru că nu este nimic de a comanda în timp ce ștergerea de înregistrări.
Deci interogarea finală ar trebui să fie ca aceasta:
DELETE WorkRecord2
FROM WorkRecord2
INNER JOIN Employee
ON EmployeeRun=EmployeeNo
WHERE Company = '1'
AND Date = '2013-05-06';
Posibil să fie de ajutor pentru tine -
DELETE FROM dbo.WorkRecord2
WHERE EmployeeRun IN (
SELECT e.EmployeeNo
FROM dbo.Employee e
WHERE ...
)
Sau să încerce acest lucru -
DELETE FROM dbo.WorkRecord2
WHERE EXISTS(
SELECT 1
FROM dbo.Employee e
WHERE EmployeeRun = e.EmployeeNo
AND ....
)
În SQL Server Management Studio pot crea cu ușurință un "SELECTAȚI" interogare.
SELECT Contact.Naam_Contactpersoon, Bedrijf.BedrijfsNaam, Bedrijf.Adres, Bedrijf.Postcode
FROM Contact
INNER JOIN Bedrijf ON Bedrijf.IDBedrijf = Contact.IDbedrijf
Pot să-l execute, și toate contactele sunt afișate.
Acum schimba "SELECTAȚI" pentru un "DELETE":
DELETE Contact
FROM Contact
INNER JOIN Bedrijf ON Bedrijf.IDBedrijf = Contact.IDbedrijf
Toate înregistrările-ai văzut în "SELECTAȚI" declarație va fi eliminat.
Puteți crea chiar mai dificil inner join cu el aceeași procedură, de exemplu:
DELETE FROM Contact
INNER JOIN Bedrijf ON Bedrijf.IDBedrijf = Contact.IDbedrijf
INNER JOIN LoginBedrijf ON Bedrijf.IDLoginBedrijf = LoginBedrijf.IDLoginBedrijf
DELETE a FROM WorkRecord2 a
INNER JOIN Employee b
ON a.EmployeeRun = b.EmployeeNo
Where a.Company = '1'
AND a.Date = '2013-05-06'
Un alt mod, folosind 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ă : nu Putem folosi se ALĂTURE "în interiorul" CTE
atunci când doriți pentru a "șterge".
Aceasta este o simplă interogare pentru a șterge înregistrările din două masă la un moment dat.
DELETE table1.* ,
table2.*
FROM table1
INNER JOIN table2 ON table1.id= table2.id where table1.id ='given_id'
Nu't specifica tabelele pentru "Societate" și "Data", ați putea dori pentru a repara asta.
Standardul SQL folosind MERGE
:
MERGE WorkRecord2 T
USING Employee S
ON T.EmployeeRun = S.EmployeeNo
AND Company = '1'
AND Date = '2013-05-06'
WHEN MATCHED THEN DELETE;
Răspunsul de la @Devart este, de asemenea, SQL Standard, deși incompletă, ar trebui să arate cam asa:
DELETE
FROM WorkRecord2
WHERE EXISTS ( SELECT *
FROM Employee S
WHERE S.EmployeeNo = WorkRecord2.EmployeeRun
AND Company = '1'
AND Date = '2013-05-06' );
Cel mai important lucru de reținut în legătură cu cele de mai sus este este clar șterge vizează un singur tabel, ca executată în cel de-al doilea exemplu prin impunerea unui scalar subinterogare.
Pentru mine diverse proprietate sintaxa răspunsurile sunt mai greu de citit și de înțeles. Cred că mentalitatea este cel mai bine descris în răspunsul de @frans eilering adică persoana care a scris codul nu't intereseaza neaparat despre persoana care va citi și de a menține cod.
Aici's ceea ce am în prezent utilizați pentru ștergerea sau actualizarea:
DELETE w
FROM WorkRecord2 w,
Employee e
WHERE w.EmployeeRun = e.EmployeeNo
AND w.Company = '1'
AND w.Date = '2013-05-06'