Ik wil verwijderen met INNER JOIN
in 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 DELETE
en FROM
van 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 SELECT
vraag:
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 SELECT
in 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 JOIN
niet gebruiken binnen CTE
als 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 Company
en Date
niet 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'
)