Access 2010查询语法错误

时间:2017-11-28 15:39:04

标签: sql ms-access access-vba

(1)Access数据库被用作连接2个Teradata数据库的方式 (2)目前它有2个链接表到2个Teradata数据库 (3)如果它是对Teradata的访问查询或传递查询,对我来说无关紧要 (4)目标是在Excel宏中放置一些东西,它将查询2个Teradata基础并返回一些将包含在宏中的信息

我试图在Access中使用在Teradata中运行的SQL创建SQL查询。当我尝试运行查询时,我收到错误消息(FROM子句中的语法错误)并突出显示第一个连接。我之前在Access中编写了查询但没有这么复杂。我们正在使用Access 2010.非常感谢有关语法错误的任何建议。谢谢你的帮助.......

select veh_mgmt_csr.cst_bo_item.veh_lgcy_nbr as unit, veh_mgmt_csr.cst_bo_item.veh_odmtr_qty as mileage, veh_mgmt_csr.rm_cust_mast.upp_lgl_cust_nam as cust_legal_name, veh_mgmt_csr_rv.cst_address.addr_st_nam as address,
veh_mgmt_csr_rv.cst_address.addr_cty_nam as city, veh_mgmt_csr_rv.cst_address.addr_postl_cde as zip, veh_mgmt_csr_rv.cst_address.stprov_cde as state, veh_mgmt_csr_rv.cst_address.cntry_iso_cde as country, veh_mgmt_csr_rv.cst_address.addr_phn_nbr as location_phone, e.contact_name, e.contact_phone
from veh_mgmt_csr.cst_buyer_order
Join veh_mgmt_csr.cst_bo_item on veh_mgmt_csr.cst_buyer_order.bo_id = veh_mgmt_csr.cst_bo_item.bo_id and veh_mgmt_csr.cst_bo_item.veh_invy_stat_dsc = 'SOLD'
Join veh_mgmt_csr.rm_cust_mast on veh_mgmt_csr.cst_buyer_order.rm_cust_id = veh_mgmt_csr.rm_cust_mast.rm_cust_id
Join VEH_MGMT_CSR_RV.cst_address on veh_mgmt_csr.rm_cust_mast.prim_addr_id = veh_mgmt_csr_rv.cst_address.addr_id and veh_mgmt_csr_rv.cst_address.record_status = 'A'
left join (select veh_mgmt_csr.cst_buyer_order.e_o_id cust_nbr,trim(veh_mgmt_csr.cst_individual.indiv_upp_frst_nam) || ' ' || trim(veh_mgmt_csr.cst_individual.indiv_upp_last_nam) contact_name,
VEH_MGMT_CSR_RV.CST_PHONE_NBR.phn_nbr contact_phone from veh_mgmt_csr.cst_e_o_cntct
left join veh_mgmt_csr.cst_individual on veh_mgmt_csr.cst_e_o_cntct.indiv_id = veh_mgmt_csr.cst_individual.indiv_id
left join  VEH_MGMT_CSR_RV.CST_PHONE_NBR on veh_mgmt_csr.cst_e_o_cntct.indiv_id = VEH_MGMT_CSR_RV.CST_PHONE_NBR.indiv_id and VEH_MGMT_CSR_RV.CST_PHONE_NBR.prim_phn_ind = 1
qualify rank() over (partition by veh_mgmt_csr.cst_e_o_cntct.e_o_id order by contact_name asc) = 1) e  on veh_mgmt_csr.rm_cust_mast.rm_cust_id = e.cust_nbr
where veh_mgmt_csr.cst_individual.veh_lgcy_nbr = '8B5RG1'
and veh_mgmt_csr.cst_e_o_cntct.cntry_iso_cde in ('US','CA')
and extract(year from veh_mgmt_csr.cst_e_o_cntct.bo_dte) = 2017

1 个答案:

答案 0 :(得分:1)

作为SQL的初学者,请注意虽然大多数RDBMS包括MS Access和Teradata都可以运行ANSI-SQL(基本的,标准的DDL / DML语句),但几乎没有两个RDBMS共享相同的方言(ANSI-plus)。每个都保持自己的风格和具体方法。

此外,请注意MS Access有两个部分:1)GUI .exe应用程序和2)数据库引擎(ACE / JET数据库引擎)。随着时间的推移它已被混淆为相同,但事实并非如此。请参阅此meta帖子。默认情况下,以前的.exe应用程序连接到默认数据库引擎,但是可以为Teradata等其他后端切换此默认值。

但是,前端GUI和后端数据库之间的method of connection(即链接表,传递查询,应用程序代码)在使用的SQL方言中会有所不同。

  1. 链接表=> MS Access SQL方言
  2. 传递查询=>后端RDBMS数据库方言
  3. 应用程序代码(即VBA)=>后端RDBMS数据库方言
  4. 您可能正在尝试在MS Access链接表上运行Teradata SQL,因此违反#1会导致语法错误。如下所示,通过适当的缩进,您尝试的查询中存在多种不兼容的语法:

    1. MS Access在表名和列名之间仅使用一个句点限定符。可能您可能引用了一个命名模式,仅在Teradata中可用。
    2. MS Access本身不使用JOIN,但需要INNERLEFTRIGHT(否OUTER);
    3. 只要在JOIN子句中使用了一对表,MS Access就需要使用括号;
    4. MS Access不支持RANK() OVER...;
    5. 等窗口功能
    6. MS Access在连接中使用&而不是双重||并使用Year()而不是extract(year ...);并且不使用qualify,可能严格地使用Teradata方法;
    7. 对于列别名,MS Access需要AS,例如 contact_name contact_phone
    8. <强> SQL

      SELECT    veh_mgmt_csr.cst_bo_item.veh_lgcy_nbr      AS unit,
                veh_mgmt_csr.cst_bo_item.veh_odmtr_qty     AS mileage,
                veh_mgmt_csr.rm_cust_mast.upp_lgl_cust_nam AS cust_legal_name,
                veh_mgmt_csr_rv.cst_address.addr_st_nam    AS address,
                veh_mgmt_csr_rv.cst_address.addr_cty_nam   AS city,
                veh_mgmt_csr_rv.cst_address.addr_postl_cde AS zip,
                veh_mgmt_csr_rv.cst_address.stprov_cde     AS state,
                veh_mgmt_csr_rv.cst_address.cntry_iso_cde  AS country,
                veh_mgmt_csr_rv.cst_address.addr_phn_nbr   AS location_phone,
                e.contact_name,
                e.contact_phone
      FROM      veh_mgmt_csr.cst_buyer_order
      JOIN      veh_mgmt_csr.cst_bo_item
      ON        veh_mgmt_csr.cst_buyer_order.bo_id = veh_mgmt_csr.cst_bo_item.bo_id
      AND       veh_mgmt_csr.cst_bo_item.veh_invy_stat_dsc = 'SOLD'
      JOIN      veh_mgmt_csr.rm_cust_mast
      ON        veh_mgmt_csr.cst_buyer_order.rm_cust_id = veh_mgmt_csr.rm_cust_mast.rm_cust_id
      JOIN      veh_mgmt_csr_rv.cst_address
      ON        veh_mgmt_csr.rm_cust_mast.prim_addr_id = veh_mgmt_csr_rv.cst_address.addr_id
      AND       veh_mgmt_csr_rv.cst_address.record_status = 'A'
      LEFT JOIN
                (
                 SELECT    veh_mgmt_csr.cst_buyer_order.e_o_id cust_nbr,
                           Trim(veh_mgmt_csr.cst_individual.indiv_upp_frst_nam)
                                || ' ' || 
                           Trim(veh_mgmt_csr.cst_individual.indiv_upp_last_nam) contact_name,
                           veh_mgmt_csr_rv.cst_phone_nbr.phn_nbr                contact_phone
                 FROM      veh_mgmt_csr.cst_e_o_cntct
                 LEFT JOIN veh_mgmt_csr.cst_individual
                 ON        veh_mgmt_csr.cst_e_o_cntct.indiv_id = veh_mgmt_csr.cst_individual.indiv_id
                 LEFT JOIN veh_mgmt_csr_rv.cst_phone_nbr
                 ON        veh_mgmt_csr.cst_e_o_cntct.indiv_id = veh_mgmt_csr_rv.cst_phone_nbr.indiv_id
                 AND       veh_mgmt_csr_rv.cst_phone_nbr.prim_phn_ind = 1 
                           qualify rank() OVER (partition BY veh_mgmt_csr.cst_e_o_cntct.e_o_id 
                 ORDER BY contact_name ASC) = 1) e
      ON        veh_mgmt_csr.rm_cust_mast.rm_cust_id = e.cust_nbr
      WHERE     veh_mgmt_csr.cst_individual.veh_lgcy_nbr = '8B5RG1'
      AND       veh_mgmt_csr.cst_e_o_cntct.cntry_iso_cde IN ('US','CA')
      AND       extract(year FROM veh_mgmt_csr.cst_e_o_cntct.bo_dte) = 2017;
      

      根据您的更新,请执行以下操作:

      1. 要保持Teradata语法,请为每个数据库创建2个传递查询(使用与链接表相同的ODBC连接)。
      2. 运行相同的生成表查询(SELECT * INTO myAccessTable FROM myTeradataPassThroughQuery)以将Teradata结果移动到Access本地表中。
      3. 使用Access SQL语法加入两个新表以获得最终结果。
相关问题