¿Cómo eliminar usando INNER JOIN con SQL Server?

1283

Quiero eliminar usando INNER JOINen SQL Server 2008 .

Pero me sale este error:

Mensaje 156, Nivel 15, Estado 1, Línea 15
Sintaxis incorrecta cerca de la palabra clave 'INNER'.

Mi código:

DELETE FROM WorkRecord2 
INNER JOIN Employee ON EmployeeRun=EmployeeNo
WHERE Company = '1' AND Date = '2013-05-06'
nettoon493
fuente
2
El ejemplo C en la documentación muestra cómo usar DELETEcon una combinación
Pondlife
1
El ejemplo C usa un cursor y un montón de cosas extrañas también
reggaeguitar
Eliminar de la tabla1 de la tabla1 t1 unión interna tabla2 t2 en t1.id = t2.id; en detalles youtu.be/_tyUVrS2iH4
Amresh Kumar Singh

Respuestas:

2243

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'
Taryn
fuente
99
@bluefeet ¿podría proporcionar la sintaxis correcta para SQL Server para eliminar de ambas tablas?
oabarca
44
@ user2070775 En SQL Server para eliminar de 2 tablas necesita usar 2 declaraciones separadas.
Taryn
8
@ user2070775 en SQL Server, puede usar transacciones y pseudo-tablas, como se muestra en stackoverflow.com/questions/783726/…
Mathieu Rodic
1
@ MathieuRodic gracias por compartir. En mi configuración, si elimino de las 2 tablas por separado, ya no sé qué filas eliminar de la segunda tabla, así que esto ayudará :)
Verena Haunschmid
2
@ShahryarSaljoughi, que es el alias de la tabla WorkRecord2.
Taryn
151

Simplemente agregue el nombre de la tabla entre DELETEy FROMdesde donde desea eliminar registros porque tenemos que especificar la tabla que desea eliminar. También elimine la ORDER BYcláusula porque no hay nada que pedir al eliminar registros.

Entonces su consulta final debería ser así:

    DELETE WorkRecord2 
      FROM WorkRecord2 
INNER JOIN Employee 
        ON EmployeeRun=EmployeeNo
     WHERE Company = '1' 
       AND Date = '2013-05-06';
hims056
fuente
3
Este funciona en SQL Server si solo desea eliminar de la primera tabla.
TroySteven
1
@matwonk: puede eliminar de la segunda tabla si usa el nombre de la segunda tabla. Por ejemplo, el uso DELETE Employeese eliminará de la tabla del empleado en lugar de la WorkRecord2tabla.
hims056
1
@matwonk: Aquí hay un ejemplo: 1) Eliminar de la primera tabla 2) Eliminar de la segunda tabla .
hims056
30

Posible que esto sea útil para usted.

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 ....
)
Devastar
fuente
1
Esta es la única respuesta que funciona en SQL Server. Simplemente cree su consulta como seleccionar Id de ... unirse ... unirse, etc., luego envolverla como una subconsulta y hacer una eliminación de (tabla) donde Id en (subconsulta)
Chris Moschini
28

Prueba esto:

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

Debería ser:

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

Esta versión debería funcionar

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

En SQL Server Management Studio puedo crear fácilmente una SELECTconsulta.

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 cambie el SELECTa a DELETE:

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

SELECTSe eliminarán todos los registros que vio en la declaración.

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
Frans eilering
fuente
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'
Dhanraj Mittal
fuente
9

Prueba 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';
Ali
fuente
8
Estoy bastante seguro de que DELETE solo puede especificar una tabla. Esto no funciona para mi.
Stealth Rabbi
3
Creo que puede especificar varias tablas para su eliminación en mySQL, pero no SQL Server (que se hace la pregunta).
dandev91
7

Otra forma de usar 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 el JOINinterior CTEcuando lo desee delete.

P ரதீப்
fuente
6

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'
Ady
fuente
2
Esta pregunta es para SQL Server. No puede eliminar de dos tablas en una declaración en SQL Server. Entiendo que esto se puede hacer en mysql y MS Access.
Darren Griffith
6

Intenta esto, podría ayudar

 DELETE WorkRecord2 
          FROM WorkRecord2 
    INNER JOIN Employee 
            ON EmployeeRun=EmployeeNo
         WHERE Company = '1' 
           AND Date = '2013-05-06';
viraj sharma
fuente
77
¿En qué se diferencia de la respuesta aceptada: stackoverflow.com/questions/16481379/… ?
configuración regional predeterminada
3
Esta respuesta utiliza nombres de tabla explícitos en lugar de alias, lo que hace que sea más fácil para los menos experimentados leer / entender lo que está sucediendo.
Joshua Burns el
1
@ JoshuaBurns: Todavía duplicado exacto de mi respuesta .
hims056
4

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)
ozzy432836
fuente
4

No especifica las tablas para CompanyyDate , es posible que desee solucionarlo.

SQL estándar usando 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 verse más así:

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 está dirigida a una sola tabla, como se impone en el segundo ejemplo al requerir una subconsulta escalar.

Para mí, las diversas respuestas de sintaxis patentadas son más difíciles de leer y comprender. Supongo que la mentalidad para se describe mejor en la respuesta de @frans eilering, es decir, la persona que escribe el código no necesariamente se preocupa por la persona que leerá y mantendrá el código.

un día cuando
fuente
4

Esto es lo que uso actualmente para eliminar o incluso actualizar:

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