2016-09-13 9 views
1

MS AccessのVBAスクリプトを選択:更新を組み合わせる&SQL文SQL文を作成

私は新しいテーブルSATableに2つのフィールドを導出SQLステートメントを持っている:

SQLScript = "SELECT [DATA OUTPUT TABLE].* INTO SATable" 
SQLScript = SQLScript & " FROM [DATA OUTPUT TABLE]" 
SQLScript = SQLScript & " WHERE ((([DATA OUTPUT TABLE].[Journal Voucher ID]) In (SELECT [DATA OUTPUT TABLE].[Journal Voucher ID]" 
SQLScript = SQLScript & " FROM [DATA OUTPUT TABLE]" 
SQLScript = SQLScript & " GROUP BY [DATA OUTPUT TABLE].[Journal Voucher ID]" 
SQLScript = SQLScript & " HAVING (((First([DATA OUTPUT TABLE].dBranch))=" & Chr(34) & "Navy" & Chr(34) & ") AND ((Last([DATA OUTPUT TABLE].dBranch))=" & Chr(34) & "USMC" & Chr(34) & ")) OR (((First([DATA OUTPUT TABLE].dBranch))=" & Chr(34) & "USMC" & Chr(34) & ") AND ((Last([DATA OUTPUT TABLE].dBranch))=" & Chr(34) & "Navy" & Chr(34) & "));)));" 
DoCmd.RunSQL SQLScript 

をその後、私はその文を持っています

DoCmd.RunSQL "UPDATE SATable INNER JOIN [DATA OUTPUT TABLE] ON (SATable.[Journal Voucher ID] = [DATA OUTPUT TABLE].[Journal Voucher ID]) AND (SATable.dBranch = [DATA OUTPUT TABLE].dBranch) SET [DATA OUTPUT TABLE].[Shared Appropriations] = [SATable].[dBranch] & " & Chr(34) & " Shared Appropriation" & Chr(34) & ";" 

私の目標は、SATableを削除してこのステートメントを1つのステートメントで実行することです。

私はこのような問題に苦しんでいます。答えを提供するのではなく、いくつかの説明を教えてください。

乾杯、 -E

EDIT:----------------------------------- -------------------------- データ出力表はあります

JVID dBranch SA 
    1 Navy N/A 
    2 Navy N/A 
    3 Navy N/A 
    4 Navy N/A 
    A USMC N/A 
    B USMC N/A 
    3 USMC N/A 
    4 USMC N/A 

のでSATableは次のようになります。

JVID dBranch SA 
    3 Navy Navy SA 
    3 USMC USMC SA 
    4 Navy Navy SA 
    4 USMC USMC SA 

次に、更新クエリによってSAフィールドが更新されます。デフォルトはN/Aです

自身の10
JVID dBranch SA 
    1 Navy N/A 
    2 Navy N/A 
    3 Navy Navy SA 
    4 Navy Navy SA 
    A USMC N/A 
    B USMC N/A 
    3 USMC USMC SA 
    4 USMC USMC SA 
+0

私はSQLを少し簡略化できるかもしれないと思う。私は、あなたがサンプルデータと期待される出力を持つテーブルを表示すると助けになると思います。 –

+0

私はデータを共有することはできませんが、目的に応じて展開します – Schalton

+0

[データ出力テーブル]と[SATable](3番目のテーブルの結果)をワンステップで選択しますか?または、[DATA OUTPUT TABLE]に更新を適用しますか? –

答えて

1

わかりましたので、私は仮定または2を作ることかもしれませんが、あなたが本当にやりたいことは(私のスクリプトで@tDataOutputTable[DATA OUTPUT TABLE]に参加することであるように見えます(あなたがやっていることに似ている)と、 JVIDsに一致するレコードのみを更新しますが、dBranch

ここでは、dBranchの列が一致しないレコードに一致します。あなたが「Navy」と「USMC」のdBranchでのみこれを実行したい場合は、d.dBranch <> d2.dBranchをあなたのもののようなものに置き換えることができます。ここで

は、私はそれをテストするために作成したSQLスクリプトです:

DECLARE @tDataOutputTable TABLE 
(
    JVID varchar(max), 
    dBranch varchar(max), 
    SA varchar(max) 
) 

INSERT INTO @tDataOutputTable (JVID, dBranch, SA) 
VALUES 
('1', 'Navy', 'N/A'), 
('2', 'Navy', 'N/A'), 
('3', 'Navy', 'N/A'), 
('4', 'Navy', 'N/A'), 
('A', 'USMC', 'N/A'), 
('B', 'USMC', 'N/A'), 
('3', 'USMC', 'N/A'), 
('4', 'USMC', 'N/A') 

UPDATE d 
    SET d.SA = d.dBranch + ' SA' -- or 'Shared Appropriation' 
FROM @tDataOutputTable d 
    INNER JOIN @tDataOutputTable d2 ON d.JVID = d2.JVID AND d.dBranch <> d2.dBranch 

SELECT * FROM @tDataOutputTable 

私はVBAとAccessの複雑さとその慣れていないんだけど、うまくいけば、このような何かが動作するはずです:

SQLScript = "UPDATE [DATA OUTPUT TABLE] AS d" 
SQLScript = SQLScript & " INNER JOIN [DATA OUTPUT TABLE] AS d2 ON d.JVID = d2.JVID AND d.dBranch <> d2.dBranch" 
SQLScript = SQLScript & " SET d.SA = d.dBranch" & Chr(34) & " Shared Appropriation" & Chr(34) & ";" 
DoCmd.RunSQL SQLScript 
+0

フィードバックいただきありがとうございます。それは少なくとも部分的に正しいです。 変数名が作成され、コード内で "d"のように使用されるSQL文を見てきました。それはどうですか? 私のスクリプトはGroup By&Havingを使用して、ネイビーとUSMCの両方の[dbranch]を持つ[JVID]のみのレコードリストを取得します。次に、[JVID]で更新クエリが結合され、[SA]フィールドがN/Aから[dbranch] + "SA"に更新されます。 – Schalton

+0

@Schalton、Okay、私はAccessでこれを試して、うまくいくはずです。基本的には、SATableを作成するのではなく、 'JVID'がマッチし、' dBranch'がマッチしない[DATA OUTPUT TABLE]に参加します。 'AS d'はエイリアスと呼ばれ、それ自身の上でテーブルに加わることができます。 –

+0

私はフィールドレベルでのみ、テーブルレベルでエイリアスを使ったことはありませんでした。ありがとう! – Schalton

関連する問題