SQL Update Multiple Fields FROM via a SELECT Statement

后端 未结 6 1546
生来不讨喜
生来不讨喜 2020-12-29 18:50

This works, but i would like to remove the redundancy. Is there a way to merge the update with a single select statement so i don\'t have to use vars?

    DE         


        
6条回答
  •  天涯浪人
    2020-12-29 19:27

    I just had to solve a similar problem where I added a Sequence number (so that items as grouped by a parent ID, have a Sequence that I can order by (and presumably the user can change the sequence number to change the ordering).

    In my case, it's insurance for a Patient, and the user gets to set the order they are assigned, so just going by the primary key isn't useful for long-term, but is useful for setting a default.

    The problem with all the other solutions is that certain aggregate functions aren't allowed outside of a SELECT

    This SELECT gets you the new Sequence number:

    select PatientID,
           PatientInsuranceID, 
           Sequence, 
           Row_Number() over(partition by PatientID order by PatientInsuranceID) as RowNum
    from PatientInsurance
    order by PatientID, PatientInsuranceID
    

    This update command, would be simple, but isn't allowed:

    update PatientInsurance
    set Sequence = Row_Number() over(partition by PatientID order by PatientInsuranceID)
    

    The solution that worked (I just did it), and is similar to eKek0's solution:

    UPDATE PatientInsurance
    SET  PatientInsurance.Sequence = q.RowNum
    FROM (select PatientInsuranceID, 
                 Row_Number() over(partition by PatientID order by PatientInsuranceID) as RowNum
          from PatientInsurance
         ) as q 
    WHERE PatientInsurance.PatientInsuranceID=q.PatientInsuranceID 
    

    this lets me select the ID I need to match things up to, and the value I need to set for that ID. Other solutions would have been fine IF I wasn't using Row_Number() which won't work outside of a SELECT.

    Given that this is a 1 time operation, it's coding is still simple, and run-speed is fast enough for 4000+ rows

提交回复
热议问题