2016-07-15 9 views
0

最初に長いタイトルをお詫びしますが、別の適切なタイトルを見つけることができませんでした 私は説明します: データベースには3テーブル、1つはドキュメントのヘッダ、1つは関連する詳細のためのもの、 と3種類目は異なる種類のドキュメント間のリンクです(例えば、 の送付状とそれに続く請求書がある場合、通常は月、グループ分けすべて 同月の配達メモ)。関与 テーブルとフィールドが呼び出されます。同じテーブルのレコードを更新して、別のテーブルの共通レコードを検索する

+ DO11_DOCTESTATA (for the headers) 
    - DO11_DOCUM_MG36 Gives the type of the document stored (I need to retrieve data from 'FOR-FATRIEPDDT' and insert into 'FOR-DDT' 
    - DO11_NUMDOC Contains the number of the document, needed to search WHERE do11_numdoc = equals the same number in DO33_DOCCORPORIF 

    + DO30_DOCCORPO (for the details) 
    - DO30_PREZZO1 Contains the unity price, when I have a match between do11_numdoc = do33_doccorporif.do33_numnsdoc, I update this field) 
    - DO30_PREZZO1IVA Same as before, but price added with VAT 
    - DO30_IMPORTO Price * Quantity 
    - ... 
    - ... 

    + DO33_DOCCORPORIF (for the links) 
    - DO33_NUMNSDOC Which contains the number of the relative delivery note that I need to compare to DO11_DOCTESTATA.DO11_NUMDOC to find a match 

私は投票された数を一致させることによって、対応する納品書に同じ値を入れて請求書 から価格を更新する必要があるため、私の要求がDO30_DOCCORPOの一部のフィールドを更新することです文書を た場合にのみ、私はデータを更新してることを意味DO33_DOCCORPORIF.DO33_NUMNSDOC

で同じフィールド とDO11_DOCTESTATA.DO11_NUMDOC一致するものが見つかったとき、私は「FOR-DDT」DO11_DOCTESTATA = DO30_DOCCORPO、内のフィールドを更新する必要がありますタイプは配達通知( 'FOR-DDT')です。

更新する必要のあるデータを提供するSELECTクエリを作成できましたが、 SQL言語での経験が不足しているため、このクエリをUPDATEに「変換」できません。これはSELECTクエリです

SELECT do11_doctestata.do11_docum_mg36, 
    do11_doctestata.do11_datadoc, 
    do11_doctestata.do11_numdoc, 
    do11_doctestata.do11_sezdoc, 
    do33_doccorporif.do33_numnsdoc, 
    do30_doccorpo.do30_codart_mg66, 
    do30_doccorpo.do30_qta1, 
    do30_doccorpo.do30_prezzo1, 
    do30_doccorpo.do30_prezzo1iva, 
    do30_doccorpo.do30_importo, 
    do30_doccorpo.do30_importoiva, 
    do30_doccorpo.do30_impnetscp 
FROM do11_doctestata 
    INNER JOIN do33_doccorporif 
      ON do11_doctestata.do11_numdoc = do33_doccorporif.do33_numnsdoc 
    INNER JOIN do30_doccorpo 
      ON do11_doctestata.do11_ditta_cg18 = 
       do30_doccorpo.do30_ditta_cg18 
       AND do11_doctestata.do11_numreg_co99 = 
        do30_doccorpo.do30_numreg_co99 
WHERE (do11_doctestata.do11_docum_mg36 = 'FOR-DDT') 

およびhereは結果のサンプルです。ハイライトされた行は、私が更新する必要が 典型的な行ですが、唯一のときDO11_NUMDOCの番号とDO33_NUMNSDOC一致

編集:私は、管理

MERGE INTO DO30_DOCCORPO A 
    USING DO30_DOCCORPO_TEMP B 
     ON A.DO30_PROGRIGA = B.DO30_PROGRIGA 
     AND A.DO30_NUMREG_CO99 = B.DO30_NUMREG_CO99 
     AND A.DO30_DITTA_CG18 = B.DO30_DITTA_CG18 
     AND A.DO30_CAUSMAG_MG51 = '9999' 
WHEN MATCHED THEN 
    UPDATE 
     SET DO30_PREZZO1 = B.DO30_PREZZO1, 
      DO30_PREZZO1IVA = B.DO30_PREZZO1IVA, 
      DO30_IMPORTO = B.DO30_IMPORTO, 
      DO30_IMPORTOIVA = B.DO30_IMPORTOIVA, 
      DO30_IMPNETSCP = B.DO30_IMPNETSCP; 

:folllowingコードを使用して:まだこの問題 編集に貼り付けManagement Studioに何かをさせるために。実際には、実行した後、それが「影響を受ける行:1」、と言うが、1つの問題がまだあります:値は「9999」が、更新行であるとき、行

AND A.DO30_CAUSMAG_MG51 = '9999' should update WHERE DO30_CAUSMAG_MG51 = '100' 

ので、それは読んでください同じ列には、「100を有する場合'値として

答えて

0

これは必要なのですか?

UPDATE DO30_DOCCORPO 
SET DO30_DOCCORPO.do30_importo=... 
    , ... 
FROM do11_doctestata 
    INNER JOIN do33_doccorporif 
      ON do11_doctestata.do11_numdoc = do33_doccorporif.do33_numnsdoc 
    INNER JOIN do30_doccorpo 
      ON do11_doctestata.do11_ditta_cg18 = 
       do30_doccorpo.do30_ditta_cg18 
      AND do11_doctestata.do11_numreg_co99 =do30_doccorpo.do30_numreg_co99 
WHERE (do11_doctestata.do11_docum_mg36 = 'FOR-DDT') 

コメントの編集:今はどうですか?

+0

いいえ、更新はDO30_DOCCORPOで機能するはずです。そこにはレコードlke DO30_PREZZO1などがありますので、更新する必要があります –

+0

あなたのコメントの後に自分の答えを編集しました。これはあなたが探しているものですか? –

+0

大丈夫ですが、最後のリクエストとして、SET部分に何を書き込む必要がありますか? SET DO30_DOCCORPO.DO30_IMPORTO = ???どのように設定する価格を取得することができますか? –

関連する問題