42

これは機能しますが、冗長性を削除したいと思います。vars を使用する必要がないように、更新を単一の select ステートメントとマージする方法はありますか?

    DECLARE
        @OrgAddress1 varchar,
        @OrgAddress2 varchar,
        @OrgCity varchar,
        @OrgState varchar,
        @OrgZip varchar,
        @DestAddress1 varchar,
        @DestAddress2 varchar,
        @DestCity varchar,
        @DestState varchar,
        @DestZip varchar

    SELECT 
        @OrgAddress1    =   OrgAddress,
        @OrgAddress2    =   OrgAddress2,
        @OrgCity        =   OrgCity,
        @OrgState       =   OrgState,
        @OrgZip         =   OrgZip,
        @DestAddress1   =   DestAddress,
        @DestAddress2   =   DestAddress2,
        @DestCity       =   DestCity,
        @DestState      =   DestState,
        @DestZip        =   DestZip
    FROM 
        ProfilerTest.dbo.BookingDetails 
    WHERE 
        MyID=@MyID

    UPDATE SHIPMENT
    SET
        OrgAddress1     =   @OrgAddress1,
        OrgAddress2     =   @OrgAddress2,
        OrgCity         =   @OrgCity,
        OrgState        =   @OrgState,
        OrgZip          =   @OrgZip,
        DestAddress1    =   @DestAddress1,
        DestAddress2    =   @DestAddress2,
        DestCity        =   @DestCity,
        DestState       =   @DestState,
        DestZip         =   @DestZip
    WHERE 
        MyID2=@ MyID2
4

6 に答える 6

58

このようなものが動作するはずです (今はテストできません - 記憶から):

UPDATE SHIPMENT
SET
  OrgAddress1     = BD.OrgAddress1,
  OrgAddress2     = BD.OrgAddress2,
  OrgCity         = BD.OrgCity,
  OrgState        = BD.OrgState,
  OrgZip          = BD.OrgZip,
  DestAddress1    = BD.DestAddress1,
  DestAddress2    = BD.DestAddress2,
  DestCity        = BD.DestCity,
  DestState       = BD.DestState,
  DestZip         = BD.DestZip
FROM
   BookingDetails BD
WHERE 
   SHIPMENT.MyID2 = @MyID2
   AND
   BD.MyID = @MyID

それは役に立ちますか?

于 2009-08-12T18:51:06.757 に答える
8

以下を使用できます。

UPDATE s SET
  s.Field1 = q.Field1,
  s.Field2 = q.Field2,
  (list of fields...)
FROM (
  SELECT Field1, Field2, (list of fields...)
  FROM ProfilerTest.dbo.BookingDetails 
  WHERE MyID=@MyID
) q
WHERE s.MyID2=@ MyID2
于 2009-08-12T18:58:32.560 に答える
6

次の行に沿って何かを行うことができるはずです

UPDATE s
SET
    OrgAddress1 = bd.OrgAddress1,
    OrgAddress2 = bd.OrgAddress2,
    ...
    DestZip = bd.DestZip
FROM
    Shipment s, ProfilerTest.dbo.BookingDetails bd
WHERE
    bd.MyID = @MyId AND s.MyID2 = @MyID2

FROM ステートメントは (より具体的な結合を使用して) より最適化することができますが、上記の方法でうまくいくはずです。また、このように書くことの良い副次的な利点は、UPDATE s SETread への UPDATE 変更のプレビューを見ることSELECTです! 更新が行われた場合に表示されるように、そのデータが表示されます。

于 2009-08-12T19:07:25.710 に答える
1

から更新を使用できます...

何かのようなもの:

出荷セットの更新.... 出荷の内部結合 ProfilerTest.dbo.BookingDetails から ...

于 2009-08-12T18:52:18.423 に答える
0

シーケンス番号を追加した同様の問題を解決する必要がありました(親IDでグループ化されたアイテムに、注文できるシーケンスがあるようにします(おそらく、ユーザーはシーケンス番号を変更して順序を変更できます)。

私の場合、それは患者の保険であり、ユーザーは割り当てられた順序を設定できるため、主キーだけを使用することは長期的には役に立ちませんが、デフォルトの設定には役立ちます。

他のすべてのソリューションの問題は、特定の集計関数が SELECT の外では許可されていないことです。

この SELECT は、新しいシーケンス番号を取得します。

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

この更新コマンドは単純ですが、許可されていません。

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

機能したソリューション(私がやったばかりです)で、eKek0のソリューションに似ています:

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 

これにより、照合する必要がある ID と、その ID に設定する必要がある値を選択できます。SELECTの外では機能しないRow_Number()を使用していなければ、他の解決策で問題ありませんでした。

これが 1 回の操作であることを考えると、コーディングは依然として単純であり、実行速度は 4000 行以上でも十分高速です。

于 2010-11-08T21:15:46.823 に答える