2009-12-10 18 views
12

Necesito actualizar un campo de una tabla para que sea verdadero solo si existe una fila coincidente en otra tabla, para todas las filas donde la columna actualmente es nula en la tabla principal.Fila de ACTUALIZACIÓN cuando existe una fila coincidente en otra tabla

Esta es una descripción de lo que quiero lograr:

UPDATE [LenqReloaded].[dbo].[Enquiry] A 
SET [ResponseLetterSent] = 1 
WHERE [ResponseLetterSent] IS NULL 
    AND EXISTS 
     (
      SELECT * FROM [LenqReloaded].[dbo].[Attachment] B 
      WHERE A.[EnquiryID] = B.[EnquiryID] 
     ) 

Esto no es sintácticamente correcta.

No puedo codificarlo a través de una instrucción IF EXISTS ... porque no tengo el [EnquiryID] sin leer los datos de la tabla.

¿Cómo debo formatear mi instrucción UPDATE?

Respuesta

9

No estaba muy lejos ...

UPDATE A 
SET A.[ResponseLetterSent] = 1 
FROM [LenqReloaded].[dbo].[Enquiry] A 
WHERE A.[ResponseLetterSent] IS NULL 
    AND EXISTS (SELECT * FROM [LenqReloaded].[dbo].[Attachment] B WHERE A.[EnquiryID] = B.[EnquiryID]) 
2

Lo que se echa en falta es el 'de' cláusula, que es una extensión de T-SQL - es la única manera de asignar un alias a la tabla actualizada

update [lenqreloaded].[dbo].[enquiry] 
    set [responselettersent] = 1 
    from [lenqreloaded].[dbo].[enquiry] a 
    where [responselettersent] is null 
    and exists (
     select * 
     from [lenqreloaded].[dbo].[attachment] b 
     where a.[enquiryid] = b.[enquiryid] 
    ) 
4

usted necesita usar una combinación en su actualización

UPDATE [LenqReloaded].[dbo].[Enquiry] SET [ResponseLetterSent] = 1 
FROM [LenqReloaded].[dbo].[Enquiry] A 
join [LenqReloaded].[dbo].[Attachment] B on A.[EnquiryID] = B.[EnquiryID] 
WHERE A.[ResponseLetterSent] IS NULL 
4

Esto parece contrario a la intuición, pero hay que est ablish un alias de tabla en una cláusula From pero use ese alias en la cláusula Update ...

Update E Set 
    ResponseLetterSent = 1 
From LenqReloaded.dbo.Enquiry E 
Where ResponseLetterSent Is Null 
    And Exists (Select * From LenqReloaded.dbo.Attachment 
       Where EnquiryID = E.EnquiryID) 
Cuestiones relacionadas