2016-09-13 121 views
1

创造SQL语句的MS Access VBA脚本:结合更新和选择SQL语句

我有一个派生两个字段在新表SATable 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并在一条语句执行此操作。

我一直在努力解决这样的问题,所以不要只提供一个答案,你可以请提供一些解释 - 教一个人去钓鱼!

干杯, -E

编辑:----------------------------------- -------------------------- 数据输出表具有:

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

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](在第三个表中有结果)?或者你想要更新发生在[数据输出表]? –

回答

1

好了,所以我可能会做一个假设或两个,但它看起来像你真正想要做的是加入[DATA OUTPUT TABLE]@tDataOutputTable在我的脚本)本身(类似于你在做什么)和只更新匹配JVIDs但不匹配的记录dBranch

现在,这将匹配dBranch列不匹配的任何记录。如果你只希望这种情况发生在'海军'和'美国海军陆战队'的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

感谢您的反馈;这至少是部分正确的。 我已经看到了SQL语句,其中变量名称的制作和使用就像代码中的“d”。这是如何完成的? 我的脚本使用Group By&不得不获得只有海军和USMC有[dbranch]的[JVID]的记录列表。然后,更新查询加入[JVID]并将[SA]字段从N/A更新为[dbranch] +“SA” – Schalton

+0

@Schalton,好的,我在Access中尝试了这一点,并更新了代码,以便它应该管用。基本上,不是创建SATable,我们将自己加入[DATA OUTPUT TABLE],其中'JVID'匹配和'dBranch'不匹配。 'AS d'被称为别名,并允许我们自己加入表格。 –

+0

我从来没有在桌级使用过别名,只有在现场级别,这太棒了!谢谢! – Schalton