postgres - ¿Cómo eliminar usando INNER JOIN con SQL Server?
delete inner join postgres (15)
Quiero eliminar usando INNER JOIN
en SQL Server 2008 .
Pero me sale este error:
Msg 156, Nivel 15, Estado 1, Línea 15
Sintaxis incorrecta cerca de la palabra clave ''INTERIOR''.
Mi código:
DELETE FROM WorkRecord2
INNER JOIN Employee ON EmployeeRun=EmployeeNo
WHERE Company = ''1'' AND Date = ''2013-05-06''
Aquí está mi versión de SQL Server
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)
Debe especificar de qué tabla está eliminando, aquí hay una versión con un alias:
DELETE w
FROM WorkRecord2 w
INNER JOIN Employee e
ON EmployeeRun=EmployeeNo
WHERE Company = ''1'' AND Date = ''2013-05-06''
Debería ser:
DELETE zpost
FROM zpost
INNER JOIN zcomment ON (zpost.zpostid = zcomment.zpostid)
WHERE zcomment.icomment = "first"
En SQL Server Management Studio puedo crear fácilmente una consulta SELECT.
SELECT Contact.Naam_Contactpersoon, Bedrijf.BedrijfsNaam, Bedrijf.Adres, Bedrijf.Postcode
FROM Contact
INNER JOIN Bedrijf ON Bedrijf.IDBedrijf = Contact.IDbedrijf
Puedo ejecutarlo, y se muestran todos mis contactos.
Ahora cambia el SELECT a DELETE:
DELETE Contact
FROM Contact
INNER JOIN Bedrijf ON Bedrijf.IDBedrijf = Contact.IDbedrijf
Se eliminarán todos los registros que haya visto en la instrucción SELECT.
Incluso puede crear una unión interna más difícil con el mismo procedimiento, por ejemplo:
DELETE FROM Contact
INNER JOIN Bedrijf ON Bedrijf.IDBedrijf = Contact.IDbedrijf
INNER JOIN LoginBedrijf ON Bedrijf.IDLoginBedrijf = LoginBedrijf.IDLoginBedrijf
Esta versión debería funcionar
DELETE WorkRecord2
FROM WorkRecord2
INNER JOIN Employee ON EmployeeRun=EmployeeNo
Where Company = ''1'' AND Date = ''2013-05-06''
Esto es lo que uso actualmente para eliminar o incluso actualizar:
DELETE FROM w
FROM WorkRecord2 w,
Employee e
WHERE w.EmployeeRun = e.EmployeeNo
AND w.Company = ''1''
AND w.Date = ''2013-05-06''
Intenta esta consulta:
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'';
Intenta esto, podría ayudar
DELETE WorkRecord2
FROM WorkRecord2
INNER JOIN Employee
ON EmployeeRun=EmployeeNo
WHERE Company = ''1''
AND Date = ''2013-05-06'';
No especifica las tablas para Company
y Date
, es posible que desee corregir eso.
SQL estándar utilizando MERGE
:
MERGE WorkRecord2 T
USING Employee S
ON T.EmployeeRun = S.EmployeeNo
AND Company = ''1''
AND Date = ''2013-05-06''
WHEN MATCHED THEN DELETE;
La respuesta de @Devart también es SQL estándar, aunque incompleta, debería parecerse más a esto:
DELETE
FROM WorkRecord2
WHERE EXISTS ( SELECT *
FROM Employee S
WHERE S.EmployeeNo = WorkRecord2.EmployeeRun
AND Company = ''1''
AND Date = ''2013-05-06'' );
Lo importante a tener en cuenta sobre lo anterior es que está claro que la eliminación se dirige a una sola tabla, como se aplica en el segundo ejemplo al requerir una subconsulta escalar.
Para mí, las diversas respuestas de sintaxis propietarias son más difíciles de leer y comprender. Supongo que la mentalidad para se describe mejor en la respuesta por @frans eilering, es decir, la persona que escribe el código no se preocupa necesariamente por la persona que leerá y mantendrá el código.
Otra forma de utilizar 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
Nota: No podemos usar JOIN
dentro de CTE
cuando desee delete
.
Posiblemente esto te sea de utilidad.
DELETE FROM dbo.WorkRecord2
WHERE EmployeeRun IN (
SELECT e.EmployeeNo
FROM dbo.Employee e
WHERE ...
)
O prueba esto ...
DELETE FROM dbo.WorkRecord2
WHERE EXISTS(
SELECT 1
FROM dbo.Employee e
WHERE EmployeeRun = e.EmployeeNo
AND ....
)
Prueba esto:
DELETE FROM WorkRecord2
FROM Employee
Where EmployeeRun=EmployeeNo
And Company = ''1''
AND Date = ''2013-05-06''
Simplemente agregue el nombre de la tabla entre DELETE
y FROM
desde donde desea eliminar los registros porque tenemos que especificar la tabla que se eliminará. También elimine la cláusula ORDER BY
porque no hay nada que ordenar al eliminar registros.
Entonces tu consulta final debería ser así:
DELETE WorkRecord2
FROM WorkRecord2
INNER JOIN Employee
ON EmployeeRun=EmployeeNo
WHERE Company = ''1''
AND Date = ''2013-05-06'';
Esta es una consulta simple para eliminar los registros de dos tablas a la vez.
DELETE table1.* ,
table2.*
FROM table1
INNER JOIN table2 ON table1.id= table2.id where table1.id =''given_id''
DELETE a FROM WorkRecord2 a
INNER JOIN Employee b
ON a.EmployeeRun = b.EmployeeNo
Where a.Company = ''1''
AND a.Date = ''2013-05-06''