Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ms-access/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql access2000中的连接_Sql_Ms Access_Concatenation - Fatal编程技术网

Sql access2000中的连接

Sql access2000中的连接,sql,ms-access,concatenation,Sql,Ms Access,Concatenation,我搜索了“连接”主题,但找不到我需要的答案。这篇文章很接近,但我试图让它为我的目的工作失败 我有一张这样的桌子 Lic# | Permit | Year ------------------------ 1 | NS1 | 2003 1 | NS1 | 2004 1 | NS2 | 2004 2 | TR | 2012 2 | NS2 | 2012 3 | OR

我搜索了“连接”主题,但找不到我需要的答案。这篇文章很接近,但我试图让它为我的目的工作失败

我有一张这样的桌子

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  
Lic#  | Permit      | Year  
-----------------------------
1     |NS1          | 2003  
1     | NS1, NS2    | 2004  
2     | TR, NS2     | 2012  
3     | OR          | 2008  
2     | OR, NS1, TR | 2011
……等等。此表中列出了许多唯一的许可证编号,并分别列出了许可证类型和年份(从2003年到2012年)

我想要的是创建一个表来显示如下信息

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  
Lic#  | Permit      | Year  
-----------------------------
1     |NS1          | 2003  
1     | NS1, NS2    | 2004  
2     | TR, NS2     | 2012  
3     | OR          | 2008  
2     | OR, NS1, TR | 2011

正如我在评论中所说,在MySQL中使用
group\u 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

您正在尝试创建一个新表或创建一个显示该信息的查询吗?它类似于MySQL中的
group\u concat()
函数。。。然而,我认为MS Access中没有类似的函数理想情况下创建一个新表,但是如果我可以在“数据表”视图中执行一个生成类似结果的select,我可以从中创建一个新表。我还应该补充一点,我从合作伙伴机构的数据库中查询的数据,我知道正在分析,如果这有什么不同的话。请原谅我,但我仍在努力自学,还没有那么丰富的经验。您建议如何使用VBA逐行填写新表。同时,我会给这个一个机会。我非常感谢你的时间和帮助!我尝试了你的建议,得到了错误“无效的SQL语句;应为‘删除’、‘插入’、‘选择’或‘更新’……有什么建议吗?”@Andre831你需要调试代码并找到错误产生的位置。试着理解错误的原因并尝试更正它。如果你像我写的那样使用代码(如果我对字段数据类型的假设是准确的),应该没有问题。我认为错误可能出现在查询的定义(
strSQL=…
)或记录集的初始化(
set rec=…
)。你能提供更多的信息吗?我复制了它,除了包含表名。我一直在试图找出它,但迄今为止一直无法…有什么容易的,我看了吗?我会继续尝试找出它。再次感谢你的帮助!!!