在Access 2000中连接

时间:2013-04-09 23:39:22

标签: sql ms-access concatenation

我搜索了“连接”主题,但无法找到我需要的答案。这个帖子差不多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

1 个答案:

答案 0 :(得分:3)

正如我在评论中发表的那样,使用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