una partir ejemplos crear consulta tsql join

tsql - ejemplos - crear un xml a partir de una consulta sql



T-SQL: seleccionando filas para eliminar mediante uniones (11)

En SQLite, lo único que funciona es algo similar a la respuesta de beauXjames.

Parece reducirse a este DELETE FROM table1 WHERE table1.col1 IN (SOME TEMPORARY TABLE); y que algunas tablas temporales pueden crearse mediante SELECT y UNIR las dos tablas, con lo que puede filtrar esta tabla temporal según la condición en la que desea eliminar los registros en la Tabla1.

Guión:

Digamos que tengo dos tablas, TableA y TableB. La clave principal de TableB es una sola columna (BID), y es una columna de clave externa en TableA.

En mi situación, quiero eliminar todas las filas en la Tabla A que están vinculadas con filas específicas en la Tabla B: ¿Puedo hacerlo a través de uniones? ¿Eliminar todas las filas que se extraen de las uniones?

DELETE FROM TableA FROM TableA a INNER JOIN TableB b ON b.BId = a.BId AND [my filter condition]

O me veo obligado a hacer esto:

DELETE FROM TableA WHERE BId IN (SELECT BId FROM TableB WHERE [my filter condition])

La razón por la que pregunto es que me parece que la primera opción sería mucho más eficiente al tratar con tablas más grandes.

¡Gracias!


Es casi lo mismo en MySQL , pero tienes que usar el alias de la tabla justo después de la palabra "DELETE":

DELETE a FROM TableA AS a INNER JOIN TableB AS b ON a.BId = b.BId WHERE [filter condition]


Estaba intentando hacer esto con una base de datos de acceso y descubrí que necesitaba usar un. * Justo después de la eliminación.

DELETE a.* FROM TableA AS a INNER JOIN TableB AS b ON a.BId = b.BId WHERE [filter condition]


Estoy usando esto

DELETE TableA FROM TableA a INNER JOIN TableB b on b.Bid = a.Bid AND [condition]

y @TheTXI way es lo suficientemente bueno, pero leí las respuestas y los comentarios y encontré que una cosa debe responderse usando la condición en la cláusula WHERE o como condición de unión. Así que decidí probarlo y escribir un fragmento, pero no encontré una diferencia significativa entre ellos. Puede ver el script sql aquí y el punto importante es que prefiero escribirlo como commnet debido a que esta no es una respuesta exacta pero es grande y no puede incluirse en los comentarios, por favor, perdóneme.

Declare @TableA Table ( aId INT, aName VARCHAR(50), bId INT ) Declare @TableB Table ( bId INT, bName VARCHAR(50) ) Declare @TableC Table ( cId INT, cName VARCHAR(50), dId INT ) Declare @TableD Table ( dId INT, dName VARCHAR(50) ) DECLARE @StartTime DATETIME; SELECT @startTime = GETDATE(); DECLARE @i INT; SET @i = 1; WHILE @i < 1000000 BEGIN INSERT INTO @TableB VALUES(@i, ''nameB:'' + CONVERT(VARCHAR, @i)) INSERT INTO @TableA VALUES(@i+5, ''nameA:'' + CONVERT(VARCHAR, @i+5), @i) SET @i = @i + 1; END SELECT @startTime = GETDATE() DELETE a --SELECT * FROM @TableA a Inner Join @TableB b ON a.BId = b.BId WHERE a.aName LIKE ''%5'' SELECT Duration = DATEDIFF(ms,@StartTime,GETDATE()) SET @i = 1; WHILE @i < 1000000 BEGIN INSERT INTO @TableD VALUES(@i, ''nameB:'' + CONVERT(VARCHAR, @i)) INSERT INTO @TableC VALUES(@i+5, ''nameA:'' + CONVERT(VARCHAR, @i+5), @i) SET @i = @i + 1; END SELECT @startTime = GETDATE() DELETE c --SELECT * FROM @TableC c Inner Join @TableD d ON c.DId = d.DId AND c.cName LIKE ''%5'' SELECT Duration = DATEDIFF(ms,@StartTime,GETDATE())

Si puede obtener una buena razón de este script o escribir otro útil, por favor, comparta. Gracias y espero que esta ayuda.


La forma más sencilla es:

DELETE TableA FROM TableB WHERE TableA.ID = TableB.ID


La sintaxis anterior no funciona en Interbase 2007. En cambio, tuve que usar algo como:

DELETE FROM TableA a WHERE [filter condition on TableA] AND (a.BId IN (SELECT a.BId FROM TableB b JOIN TableA a ON a.BId = b.BId WHERE [filter condition on TableB]))

(Tenga en cuenta que Interbase no admite la palabra clave AS para los alias)


Sí tu puedes. Ejemplo:

DELETE TableA FROM TableA AS a INNER JOIN TableB AS b ON a.BId = b.BId WHERE [filter condition]


Supongamos que tiene 2 tablas, una con un conjunto maestro (por ejemplo, empleados) y otra con un conjunto secundario (por ejemplo, dependientes) y desea deshacerse de todas las filas de datos en la tabla de dependientes que no pueden ingresar claves con cualquier fila en la tabla principal.

delete from Dependents where EmpID in ( select d.EmpID from Employees e right join Dependents d on e.EmpID = d.EmpID where e.EmpID is null)

El punto a tener en cuenta aquí es que solo está recopilando una ''matriz'' de EmpID de la unión, el uso de ese conjunto de EmpID para realizar una operación de eliminación en la tabla Dependientes.


Yo usaría esta sintaxis

Delete a from TableA a Inner Join TableB b on a.BId = b.BId WHERE [filter condition]


puede ejecutar esta consulta: -

Delete from TableA from TableA a, TableB b where a.Bid=b.Bid AND [my filter condition]


DELETE TableA FROM TableA a INNER JOIN TableB b ON b.Bid = a.Bid AND [my filter condition]

Deberia trabajar