2017-11-28 4 views
-1

(1)アクセスデータベースが2台のTeradataデータベースに接続するために使用されています (2)現在、2台のTeradataデータベースに6つのリンクテーブルがあります (3) Teradataへのアクセスクエリまたはパススルークエリの場合 (4)目的は、2つのTeradataベースをクエリし、マクロに含まれる情報を返すExcelマクロに何かを配置することです。Access 2010 Query Syntaxエラー

私はTeradataで動作するSQLでAccessでSQLクエリを作成しようとしています。クエリを実行しようとすると、エラーメッセージが表示され(FROM句の構文エラー)、最初の結合が強調表示されます。以前はAccessでクエリを書いたことがありますが、この複雑なものは何もありません。私たちはAccess 2010を使用しています。構文エラーに関する提案は非常に高く評価されます。おかげで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 
+2

クエリは、Access SQLとほとんど共通点がないように見えます。 –

+1

^^これです。 **パススルークエリ**を代わりに使用してみてください。データベースサーバのSQL構文を使用します。 – Andre

+1

オブジェクト '\ _ Recordset'の[メソッド '開く'に失敗しましたエラーメッセージ](https://stackoverflow.com/questions/47535126/method-open-of-object-recordset-failed-error-message) –

答えて

1

は、MS AccessとのTeradata含めて、ほとんどのRDBMSのは、ANSI-SQL(基本、標準DDL/DML文)を実行する場合がありますのでご注意くださいほとんど2つのRDBMSが同じ方言(ANSI-plus)を共有していません。それぞれ独自のスタイルと固有のメソッドを保持しています。

さらに、MS Accessには、1)GUI .exeアプリケーションと2)データベースエンジン(ACE/JETデータベースエンジン)の2つのフォールドがあります。時間が経つとそれは同じになるように融合されましたが、そうではありません。このmeta投稿を参照してください。以前の.exeアプリケーションは既定では既定のデータベースエンジンに接続しますが、この既定値はTeradataなどの他のバックエンドでは使用できません。

しかし、フロントエンドGUIとバックエンドデータベース(つまり、リンクテーブル、パススルークエリ、アプリケーションコード)の間のmethod of connectionは、使用されるSQLダイアレクトでは異なります。

  1. リンクテーブル=> MS AccessのSQLダイアレクト
  2. パススルークエリ=>バックエンドRDBMSデータベース方言
  3. アプリケーション・コード(すなわち、VBA)=>バックエンドRDBMSデータベース方言

あなたMS AccessのリンクされたテーブルでTeradata SQLを実行しようとしている可能性があります。そのため、#1に違反して構文エラーが発生します。以下に適切な字下げで表示されているように、試行されたクエリにはいくつかの互換性のない構文があります。

  1. MS Accessはテーブル名と列名の間に1つのピリオド修飾子しか使用しません。 Teradataでのみ使用可能な名前付きスキーマを参照している可能性があります。
  2. MS Accessはそれ自身でJOINを使用しませんが、INNERLEFT、またはRIGHT(no OUTER)が必要です。
  3. MSアクセスでは、テーブルのペアがJOIN句で使用されるたびにかっこが必要です。
  4. MS Accessは、RANK() OVER...などのウィンドウ関数をサポートしていません。
  5. MSアクセスでは、ダブルパイプ||ではなく、連結で&が使用され、extract(year ...)の代わりにYear()が使用されます。 qualify、おそらく厳密にはTeradataメソッドを使用しません。
  6. MSアクセスでは、contact_nameおよびcontact_phoneなどの列エイリアスには、ASが必要です。あなたの更新毎

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. (リンクされたテーブルと同じODBC接続を使用して)2パススルークエリを作成し、Teradataの構文の上に保つためにデータベースごとに
  2. 同じテーブル作成クエリ(SELECT * INTO myAccessTable FROM myTeradataPassThroughQuery)を実行して、Teradataの結果をAccessローカルテーブルに移動します。
  3. Access SQL構文を使用して、最終結果の2つの新しいテーブルを結合します。
+0

@ Parfait .............情報をありがとう。私はさまざまなオプションを試してきたし、おそらく自分自身を混乱させるでしょう。私が持っているSQLはTeradataのためのものであり、まさにそれと同じように動作します。私の最初の考えは、Excel VBAからSQLを実行することでした。私は前にこれをやったが、1つのデータベースに行かなければならない。上のSQLは2つの異なるデータベースに行きます。私は2つのデータベースがあるため、2つのデータソースを使用して、リンクテーブルを持つAccessデータベースを持っています。私はパススルークエリを作成し始めましたが、1つのデータソースしか使用できませんでした。だからもうちょっと固まってしまった。 SQLは選択のみです。 – Shaves

+0

あなたの記事を編集してください(ここに長いコメントはありません):1)現在のAccessの目的と2)現在および/または必要な接続(RDBMSタイプを含むすべてのデータベース)クエリのテーブルはどのデータベースに接続しますか?)。編集ポストの下のリンクを使用してください。 – Parfait

+0

あなたの編集ごとに私の更新を見てください。両方のdbsにパススルーを使用し、ローカルテーブルを使用して結合するのと同じプロセス。 – Parfait

関連する問題