代码之家  ›  专栏  ›  技术社区  ›  Andrew Scagnelli

如何进行可编辑的联合查询?

  •  6
  • Andrew Scagnelli  · 技术社区  · 16 年前

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

    所有数据类型和字段大小都正确对齐。

    我还需要做什么才能使这个联合查询工作?

    这是查询背后的当前SQL:

    SELECT * FROM MappingQuery1 UNION SELECT * FROM MappingQuery2;
    

    编辑:

    下面的答案发布了一个链接到 KB article 可以肯定地说 UNION 无法更新查询。我有办法解决这个问题吗?例如:

    SELECT * FROM MappingQuery1, MappingQuery2;
    

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

    3 回复  |  直到 8 年前
        1
  •  6
  •   pjp    16 年前

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

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

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

    以下问题 编辑 :

    你可以用 VBA 阿多 更新相应的表。我处理这个问题的方法是确保联合表包含一个具有源表ID的列以及另一个命名源表的列。

    例如,在你的工会中,你会遇到这样的情况:

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

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

    编辑2:一天当

    这将使用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
  •  8
  •   HansUp    16 年前

    我的首选是将这些单独的表合并到主表中。由于所有数据都在一个表中,这可能会简单得多。

    但是,假设你 若要使各个表保持独立,请更改映射查询以包含源表名称的字段表达式。并在联合查询中包含该表名字段。

    然后基于只读联合查询创建连续表单。基于另一个查询添加子窗体,该查询从相应的表中返回单个可编辑记录。在主窗体的on current事件中,重写子窗体查询的行源:

    strSQL = "SELECT fields_to_edit FROM " & Me.txtTableSource & _
        " WHERE pkfield =" & Me.txtPKeyField & ";"
    Me.SubformName.Rowsource = strSQL
    Me.SubformName.Requery
    
        3
  •  -1
  •   bcmarshall    8 年前

    这是一条非常古老的线索,但我在寻找解决这一问题的方法,并发现了它。我有一个复选框值,它通过几个联合查询推送,当我试图更新它时,当然不能。

    不过,我确实找到了一个解决方案,并想和大家分享一下。在复选框的OnEnter事件上,我只运行了一个SQL更新查询,它更新了要修改的基础表中的字段。如果是真的,我会更新为假,如果是假的,我会更新为真。哇!

    推荐文章