如何进行可编辑的UNION查询?

时间:2009-08-11 17:52:55

标签: sql ms-access ms-access-2007 ms-office

在复杂的数据库结构过程中,我需要为用户提供一种编辑存储在一系列表中的数据的方法。尽管所有数据类型都相同,但它们的名称中不会以1:1排列。为了缓解这种情况,我创建了一个查询,将原始名称(来自外部报告)映射到内部使用的名称;从这些查询中,一切都被输入一个巨大的UNION查询。

所有数据类型和字段大小都正确排列。

我还需要做些什么来使这个UNION查询工作?

这是查询背后的当前SQL:

SELECT * FROM MappingQuery1 UNION SELECT * FROM MappingQuery2;

编辑:

以下答案发布了指向KB article的链接,该链接确定无法更新UNION查询中的数据。有什么方法可以解决这个问题吗?例如:

SELECT * FROM MappingQuery1, MappingQuery2;

这会有用吗?请记住,所有字段都在类型,大小和名称中对齐。

3 个答案:

答案 0 :(得分:8)

我的偏好是将这些单独的表合并到主表中。将所有数据放在一个表中,这可能会更容易。

但是,假设 保持单独的表分开,请更改映射查询以包含源表名的字段表达式。并在UNION查询中包含该表名字段。

然后基于只读UNION查询创建连续表单。根据另一个查询添加子表单,该查询从相应的表中返回单个可编辑记录。在主窗体的On Current事件中,为子窗体的查询重写RowSource:

strSQL = "SELECT fields_to_edit FROM " & Me.txtTableSource & _
    " WHERE pkfield =" & Me.txtPKeyField & ";"
Me.SubformName.Rowsource = strSQL
Me.SubformName.Requery

答案 1 :(得分:7)

  

当查询是Union查询时,您   无法更新查询中的数据。

http://support.microsoft.com/kb/328828

当Access在联合查询中组合来自不同表的行时,各个行将丢失其基础表标识。当您尝试更改联合查询中的行时,Access无法知道您要更新的表,因此它不允许所有更新。

以下问题修改

您可以使用 VBA ADO 解决此问题,以更新相应的表格。我接近这个的方法是确保你的union表包含一个列,该列具有源表中的id以及另一个命名源表的列。

e.g。在你的工会你会有这样的事情:

SELECT 'Table1', id, ... FROM Table1
UNION 
SELECT 'Table2', id, ... FROM Table2

然后通过数据输入表单和VBA,您可以查看当前所选行的值并更新相关表。

编辑2:onedaywhen

这使用Access VBA

将值插入表中
Option Compare Database
Option Explicit

Public Sub InsertDataPunk(TargetTable As String, IdVal As Long, MyVal As String)

    Dim conn As ADODB.Connection
    Set conn = CurrentProject.Connection

    Dim sql As String
    'You could build something fancier here
    sql = "INSERT INTO " & TargetTable & " VALUES (" & IdVal & ",'" & MyVal & "')"

    Dim cmd As ADODB.Command
    Set cmd = New ADODB.Command
    Set cmd.ActiveConnection = conn
    cmd.CommandText = sql
    cmd.CommandType = adCmdText
    cmd.Execute

End Sub  


InsertDataPunk "Table2", 7, "DooDar"

答案 2 :(得分:0)

这是一个非常老的线程,但我一直在寻找同样的解决方案并遇到它。我有一个复选框值,通过几个Union查询推送,当我尝试更新它时,我当然不能。

然而,我确实找到了一个解决方案,并认为我会分享它。在复选框的OnEnter事件中,我只是运行了一个SQL Update查询,该查询更新了我想要修改的基础表中的字段。如果它是True我更新为False,如果False我更新为true。瞧!