【问题标题】:Concatenate in Access 2000Access 2000 中的连接
【发布时间】:2013-04-01 14:55:39
【问题描述】:

我搜索了“连接”主题,但无法找到我需要的答案。这篇帖子很接近access sql query to concatenate rows,但我试图让它为我的目的工作失败了。

我有一张这样的桌子

Lic# | Permit  | Year     
------------------------
1    | NS1     |   2003   
1    | NS1     |   2004  
1    | NS2     |   2004  
2    | TR      |   2012  
2    | NS2     |   2012  
3    | OR      |   2008   
2    | OR      |   2011  
2    | NS1     |   2011  
2    |  TR     |   2011  

....等等。此表有许多唯一的许可证编号,每个编号都列出了许可证类型和年份(从 2003 年到 2012 年)。

我想要创建一个表格来显示这样的信息

Lic#  | Permit      | Year  
-----------------------------
1     |NS1          | 2003  
1     | NS1, NS2    | 2004  
2     | TR, NS2     | 2012  
3     | OR          | 2008  
2     | OR, NS1, TR | 2011

【问题讨论】:

  • 您是在尝试创建新表还是创建显示该信息的查询?
  • 这有点像 MySQL 中的 group_concat() 函数......但是我认为 MS Access 中没有类似的函数
  • 理想情况下创建一个新表,但如果我可以选择产生类似结果的数据表视图,我可以从中创建一个新表。我还应该补充一点,我正在使用的数据是从我知道分析的合作伙伴机构的数据库中查询的,如果这有影响的话。

标签: sql ms-access concatenation


【解决方案1】:

正如我在评论中所说,这很容易在 MySQL 中使用 group_concat() 函数,但如果您想在 MS Access 中执行此操作,我认为您必须使用 VBA 来处理。

我建议你这个函数:

public function concatenatePermits(licNo as integer, year as integer)
    dim db as DAO.database, rec as DAO.recordset, strSQL as string
    dim ans as string

    set db = currentdb()
    strSQL = "select permit from [your table] " & _
             "where [lic#]=" & licNo & " and year=" & year & ";"
    set rec = db.openrecordset(strSQL, dbOpenDynaset, dbReadOnly)
    ans = ""
    with rec
        .moveFirst
        do
            if ans = "" then
                ans = !permit
            else
                ans = ans & "," & !permit
            end if
        loop until .EOF
    end with
    rec.close
    db.close
    concatenatePermits = ans
end function

此函数可用于任何查询。缺点:如果您的表非常大,使用此函数的查询的执行可能会非常慢。我认为更好的方法是创建一个空表,然后使用 VBA 逐行填充它。

希望对你有所帮助。


使用 VBA 添加行

在您的评论中,您询问如何使用 VBA 向表中添加行。假设该表存在并且您有要输入该表的数据,我建议您这样做:

public sub addData()
    dim db as dao.database, recOut as dao.recordset
    ' Declare all the variables you need for your code'
    set db = currentdb()

    ' recOut will be the table where you want to store your data '
    set recIn = db.openRecordset("tblYourOutTable",dbOpenDynaset,dbEditAdd)

    ' At some point in your code you will need to store data in your table: '
    with recOut
        .addNew
            ![A_Field] = value1
            ![Another_field] = value2
            ![Yet_another_field] = value3
        .update
    end with

    ' Close the recordset and the database objects '
    rec.close
    db.close
end sub

【讨论】:

  • 原谅我,但我仍在努力自学,还没有那么有经验。按照您的建议,如何使用 VBA 逐行填写新表。与此同时,我会试一试。非常感谢您的时间和帮助!
  • 我尝试了您的建议并收到错误“无效的 SQL 语句;应为 'DELETE'、'INSERT'、'SELECT' 或 'UPDATE'...任何建议???
  • @Andre831 您需要调试代码并找到错误的产生位置。尝试了解导致错误的原因并尝试纠正它。如果您按照我编写的方式使用代码(并且如果我对您的字段数据类型的假设是准确的),那么应该没有问题。我认为可能出现错误的地方是查询的定义 (strSQL=...) 或记录集的初始化 (set rec=...)。你能提供更多关于它的信息吗?
  • 我和你一样复制了它,只是包含了表名。我一直在试图弄清楚,但到目前为止一直无法解决......有什么容易让我过度寻找的东西吗?生病继续尝试弄清楚。再次感谢您的帮助!!!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-22
  • 2019-03-11
  • 1970-01-01
相关资源
最近更新 更多