2009-12-10 19 views
12

Muszę zaktualizować pole w tabeli, aby było prawdziwe, tylko jeśli pasujący wiersz istnieje w innej tabeli, dla wszystkich wierszy, w których kolumna jest obecnie pusta w tabeli głównej.Wiersz UPDATE, gdy pasujący wiersz istnieje w innej tabeli

Jest to opis tego, co chcę osiągnąć:

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] 
     ) 

To nie jest składniowo poprawne.

Nie mogę zakodować kodu za pomocą instrukcji IF EXISTS ... ponieważ nie mam [EnquiryID] bez odczytu danych z tabeli.

Jak sformatować instrukcję UPDATE?

Odpowiedz

9

Nie daleko były ...

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

Rzecz brakuje jest „z” klauzuli, która jest T-SQL rozszerzenie - jest to jedyny sposób, aby przypisać alias do zaktualizowana tabela

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

trzeba użyć sprzężenia w aktualizacji:

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

To wydaje się sprzeczne z intuicją, ale trzeba est zmień alias tabeli w klauzuli From, ale użyj tego aliasu w klauzuli aktualizacji ...

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)