Search code examples
sqlsql-servert-sqlsql-server-2008r2-express

SQL Server : update multiple records from joined tables


I'm using SQL Server 2008 R2 Express in my test environment and the full version in production. I have written a select statement that finds all the records I want to update. About 1200 of them. It Joins multiple tables and the selection is based on multiple fields.

What I want is to do is turn this into an update statement where all matching records have the same filed updated i.e. dFinalised is set to '2015-01-14 00:00:00.000'

I receive the following error when I run my update query

Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= , >, >= or when the subquery is used as an expression.

I expect I'm going to have to nest this somehow but I can't find a simple enough example to follow.

Thanks in advance David

The select statement is fairly simple

SELECT lMeetingRegisterID
      ,sPlanNumber
      ,sName
      ,sDescription
      ,dMeeting
      ,sMeetingTime
      ,bManaged

  FROM [Strata].[dbo].[MeetingRegister]
  inner Join MeetingType on MeetingRegister.lMeetingTypeID = meetingtype.lMeetingTypeID
  inner Join OwnersCorporation on MeetingRegister.lOwnersCorporationID = OwnersCorporation.lOwnersCorporationID
  inner Join tbluser on OwnersCorporation.lUserID = tblUser.lUserID

  WHERE dFinalised = '1900-01-01 00:00:00.000'
  AND dMeeting < '2014-07-01 00:00:00.000' 
  AND bManaged != 'N'

Here is my attempt at the update query.

Update dbo.MeetingRegister
set dFinalised = '2015-01-14 00:00:00.000'
from dbo.MeetingRegister
  inner Join MeetingType on MeetingRegister.lMeetingTypeID = meetingtype.lMeetingTypeID
  inner Join OwnersCorporation on MeetingRegister.lOwnersCorporationID = OwnersCorporation.lOwnersCorporationID
  inner Join tbluser on OwnersCorporation.lUserID = tblUser.lUserID
Where dFinalised = '1900-01-01 00:00:00.000'
  AND dMeeting < '2014-07-01 00:00:00.000' 
  AND bManaged = 'N'                

Solution

  • Try table expression

    WITH C AS (
    SELECT lMeetingRegisterID
          ,sPlanNumber
          ,sName
          ,sDescription
          ,dMeeting
          ,sMeetingTime
          ,bManaged
          ,dFinalised
    
      FROM [Strata].[dbo].[MeetingRegister]
      inner Join MeetingType on MeetingRegister.lMeetingTypeID = meetingtype.lMeetingTypeID
      inner Join OwnersCorporation on MeetingRegister.lOwnersCorporationID =    OwnersCorporation.lOwnersCorporationID
      inner Join tbluser on OwnersCorporation.lUserID = tblUser.lUserID
    
      WHERE dFinalised = '1900-01-01 00:00:00.000'
      AND dMeeting < '2014-07-01 00:00:00.000' 
      AND bManaged != 'N'
    )
    Update C
    set dFinalised = '2015-01-14 00:00:00.000'