2009-07-24 11 views
6

Necesito construir una declaración de SQL para eliminar de cierta tabla los registros que coinciden con otra instrucción de selección.Sql server DELETE and WITH cláusula

En Teradata utilizamos

delete from table1 
where (col1, col2) in (
    select col1,col2 
    from table2 
) 

Mientras que en SQL Server no se les permite tener más de 1 columna en la cláusula WHERE..IN. Pensé que puedo utilizar la cláusula WITH:

with tempTable(col1,col2) as (
select col1,col2 
from table2 
) 
delete from table1 
where table1.col1 = tempTable.col1 
and table1.col2 = tempTable.col2 

Cómo utilizar la cláusula WITH..DELETE? ¿Hay otra manera?

Respuesta

19

Esto debe hacerlo:

DELETE Table1 
from Table1 t1 
    inner join tempTable t2 
    on t2.Col1 = t1.Col1 
    and t2.Col2 = t1.Col2 
+1

... usted podría utilizar el CON cláusula, pero de esta manera es más simple. –

+0

gracias, funcionó! pero cómo usar WITH..DELETE? – ala

+0

Pensando en ello, no veo ninguna razón para usar la cláusula WITH. Uso CON cuando las cosas se ponen muy complicadas o complejas, y eliminar de una tabla basada en una simple unión a otra tabla no es lo suficientemente complejo como para justificar el esfuerzo adicional de codificación. –

1
delete from table1 t1 where exists 
    ( 

    select 1 from table2 t2 where t1.col1 = t2.col1 and t1.col2 > t2.col2 

) 
+1

Esta sintaxis es incorrecta –

+1

la sintaxis es incorrecta, pero la idea general es correcta. SQL Server puede optimizar esto, por lo que debe funcionar tan bien como una solución utilizando una combinación, mientras que es más fácil de leer IMO. – EvilRyry

4

En primer lugar construir una consulta que selecciona las filas que necesita:

SELECT t1.* 
FROM [Table1] t1 
INNER JOIN [Table2] t2 ON t1.[col1] = t2.[col1] AND t1.[Col2]=t2.[Col2] 

prueba que para asegurarse de que vuelva exactamente las filas que quiero borrar A continuación, convertirlo en una instrucción de eliminación cambiando el "SELECT" para "BORRAR" y la eliminación de la lista de columnas:

DELETE t1 
FROM [Table1] t1 
INNER JOIN [Table2] t2 ON t1.[col1] = t2.[col1] AND t1.[Col 
+0

Eso es un buen consejo en SSMS, pero no es muy práctico programáticamente ... – RolandTumble

+1

+1 para medir dos veces y cortar una vez – 2Toad

0
with tempTable(col1,col2) as (
    select col1,col2 
    from table2 
) 
delete table1 from tempTable 
where table1.col1 = tempTable.col1 
and table1.col2 = tempTable.col2 
+1

Siempre es mejor incluir alguna explicación en lugar de solo tener una respuesta de solo código, ya que la hace más útil para el futuro lectores. – EJoshuaS

+0

¡Bienvenido a Stack Overflow! Si bien este fragmento de código puede resolver el problema, no explica por qué o cómo responde la pregunta. Por favor [incluya una explicación para su código] (// meta.stackexchange.com/q/114762/269535), ya que eso realmente ayuda a mejorar la calidad de su publicación. Recuerde que usted está respondiendo la pregunta a los lectores en el futuro, y es posible que esas personas no sepan los motivos de su sugerencia de código. ** Marcadores/revisores: ** [Para respuestas de solo código como este, downvote, no eliminar!] (// meta.stackoverflow.com/a/260413/2747593) –

0

Esto funciona para mí

WITH CTE AS 
(
SELECT TOP 50000 * 
from v020101hist order by data 
) 
DELETE FROM CTE 
Cuestiones relacionadas