【问题标题】:Microsoft Access SQL Query Two Tables Many to OneMicrosoft Access SQL 多对一查询两个表
【发布时间】:2018-06-11 19:50:52
【问题描述】:

我有一个艺术品库存表。它将联系人 ID 保存为 code39 条形码。在初始化时,我需要能够根据联系人表中包含的 id 检查此 id。每个联系人都有自己的 id,并被指定一个类型。初始化代码需要填充艺术品列表,但只能由类型为“storage”、“show”和“client”的联系人拥有的作品。我可以使用 VBA,因为我没有很多编码时间来编写 Microsoft SQL 语句,但我想把 sql 写下来。一个联系人可以被未定义数量的艺术作品引用。

这些语句不起作用:\

strSQL = "SELECT [art_inventory_piece], [art_inventory_contact_id_code39]" & _
" FROM [Client Art Inventory] INNER JOIN [Client Contact]" & _
" ON [Client Art Inventory].art_inventory_contact_id_code39 = [Client Contact].contact_id_code39" & _
" WHERE [Client Contact].client_type = 'storage' or [Client Contact].client_type = 'show' or [Client Contact].client_type = 'client'"


strSQL = "SELECT [art_inventory_piece], [art_inventory_contact_id_code39]" & _
" FROM [Client Art Inventory]" & _
" WHERE [art_inventory_contact_id_code39]" & _
" in (select [contact_id_code39] from [Client Contact] where [contact_type]
  = 'storage' OR [contact_type] = 'show' OR [contact_type] = 'client')" & _
" ORDER BY [contact_id] ASC"

【问题讨论】:

  • 在这里很难说出你在问什么。你能用简单的英语解释这段代码的目标是什么吗?在这种情况下初始化是什么意思?
  • “这些语句不起作用”是什么意思。你得到了错误的数据,还是没有数据,或者你得到了一个错误,如果是这样,那是什么?另外,你用的是什么数据库?您谈论 Microsoft SQL,但也将其标记为 mysql。
  • ODBC MySQL 后端/访问前端/Microsoft SQL 语句构造记录集。很直接。我经历了多次迭代(12)大多数错误是“参数太少”。语法错误非常明显。我很确定我的问题非常基本。
  • 如果在查询设计器中重构查询,SQL-View 代码是什么?
  • 我得试一试。我根本没有使用查询生成器,因为我正在通过,它似乎从来没有相关。但我没有使用它,所以也许它是。在这个项目(下周)结束时,我将回到 C++,无论如何我都不会拥有它。我已经 4000 小时没有使用它了。

标签: mysql sql vba ms-access


【解决方案1】:

您的问题可能与误解有关:MS SQL Server 中使用了 Microsoft SQL(又名 TSQL),但 Access 中的 SQL 则完全不同。

没有看到你实际上在用 strSQL 做什么(使用 DoCmd.RunSQL 在本地运行它,或者将它传递给你的 MySQL 实例)这只是一个猜测,但我会看看你是如何分隔你的字符串的。 MS Access 使用双引号,正确的 SQL 使用单引号。

试试

strSQL = "SELECT [art_inventory_piece], [art_inventory_contact_id_code39]" & _
" FROM [Client Art Inventory] INNER JOIN [Client Contact]" & _
" ON [Client Art Inventory].art_inventory_contact_id_code39 = [Client Contact].contact_id_code39" & _
" WHERE [Client Contact].client_type = ""storage"" or [Client Contact].client_type = ""show"" or [Client Contact].client_type = ""client"""

【讨论】:

  • 我曾假设编译器正在检查 Microsoft SQL,因为 SQL 和 T-SQL 是相同的,但结果无关紧要。我知道我必须做“'”(没有空格)来插入参数。我使用 Set rst_ctl = dbs_mac.OpenRecordset(strSQL, Type:=dbOpenDynaset)。非编码文本的单引号通常有效,但我会换掉并试一试。
  • 这两种语句都不能更好地用于双双引号。
  • Access SQL 也可以用单引号很好地工作,只是 vba 需要双引号(双引号只是更传统一点)。这不是任何错误的原因
【解决方案2】:

我接受了 TBridges 的建议并使用了我从未使用过的查询生成器。稍微搞砸之后吐出这个,用单双引号。我把兔子耳朵放回去,瞧。问题似乎是,我没有从两个表中进行选择,因为我在逐步思考。

strSQL = "SELECT [Client Art Inventory].art_inventory_contact_id_code39, [Client Art Inventory].art_inventory_piece," & _
        " [Client Contact].contact_id_code39, [Client Contact].contact_type" & _
        " FROM [Client Art Inventory] INNER JOIN [Client Contact]" & _
        " ON [Client Art Inventory].art_inventory_contact_id_code39 = [Client Contact].contact_id_code39" & _
        " WHERE ((([Client Contact].contact_type)='storage' Or ([Client Contact].contact_type)='show' Or ([Client Contact].contact_type)='client'))"

[编辑]

在第二次查看问题后,很明显 select 语句本身不是罪魁祸首。我只需要查看 [Client Art Inventory].art_inventory_piece 并将字段添加到 select 语句中甚至没有意义。似乎我在 where 语句中的格式(括号)尤其受到指责。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多