2006.1 ACCESS 2000 SP-3 + PostgreSQL 8.0.4
パススルークエリやODBC Direct、ADOを使う場合、そこで用いるSQL文はPostgreSQL用のSQL文で記述しなければいけません。ACCESSのクエリのSQL文をそのまま用いても、そのSQLはPostgreSQLには理解できない方言である可能性があります。
ここではACCESSのクエリをSQLビューで表示した場合のSQLと、それをPostgreSQLで実行できるように改造したSQL文を対比しながら説明します。(関数の変換はこちら。)
クエリ例で使用しているテーブルは、リンクテーブルではダメなのかで使用したものです。
例 売上日が2005/12/1のレコードを選択するSQL文
| ACCESSクエリ | PostgreSQL用のSQL文 |
|---|---|
|
SELECT t_売上.*, t_売上.売上日 FROM t_売上 WHERE (((t_売上.売上日)=#12/1/2005#)); |
SELECT * FROM t_売上 WHERE 売上日='2005-12-1'; |
例 商品名が"定規"のレコードをふりがなを付けて選択するSQL文
| ACCESSクエリ | PostgreSQL用のSQL文 |
|---|---|
|
SELECT t_商品台帳.商品cd, t_商品台帳.商品名 , [商品名] & " じょうぎ" AS 読み FROM t_商品台帳 WHERE (((t_商品台帳.商品名)="定規"));; |
SELECT 商品cd, 商品名, "商品名" || ' じょうぎ' AS 読み FROM t_商品台帳 WHERE 商品名='定規'; |
列名"商品名"をACCESSでは[]で囲みますが、PostgreSQLでは""で囲みます。テーブル名や列名に空白を含むものを使ってしまった場合やSQLの予約語を使ってしまった場合は、SQL文中で識別子の引用符で囲う必要があります。
例 商品名が"定規"で始まるレコードを選択するSQL文
| ACCESSクエリ | PostgreSQL用のSQL文 |
|---|---|
|
SELECT t_商品台帳.商品cd, t_商品台帳.商品名 FROM t_商品台帳 WHERE (((t_商品台帳.商品名) Like "定規*")); |
SELECT 商品cd, 商品名 FROM t_商品台帳 WHERE 商品名 LIKE '定規%'; |
例 売上noが1のレコードを削除するSQL文
| ACCESSクエリ | PostgreSQL用のSQL文 |
|---|---|
|
DELETE t_売上.*, t_売上.売上no FROM t_売上 WHERE (((t_売上.売上no)=1)); |
DELETE FROM t_売上 WHERE 売上no=1; |
例 商品コードの小さいもの順5つを選択するSQL文
| ACCESSクエリ | PostgreSQL用のSQL文 |
|---|---|
|
SELECT TOP 5 t_商品台帳.商品cd, t_商品台帳.商品名 FROM t_商品台帳 ORDER BY t_商品台帳.商品cd; |
SELECT 商品cd, 商品名 FROM t_商品台帳 ORDER BY 商品cd LIMIT 5; |
ACCESSのTOPではTOP 5 PERCENTのようにパーセント指定が可能ですが、PostgreSQLのLIMITにはこれに相当する機能がありません。
例 売上日が2005/12/1以降の売上について、商品分類cdが1の商品の売り単価を10%UPするSQL文
| ACCESSクエリ | PostgreSQL用のSQL文 |
|---|---|
|
UPDATE t_売上 INNER JOIN t_商品台帳 ON t_売上.商品cd=t_商品台帳.商品cd SET t_売上.単価 = [単価]*1.1 WHERE (((t_商品台帳.商品分類cd)=1) AND ((t_売上.売上日)>=#12/1/2005#)); |
UPDATE t_売上 SET 単価 = 単価*1.1 FROM t_商品台帳 WHERE t_売上.商品cd=t_商品台帳.商品cd AND t_商品台帳.商品分類cd=1 AND t_売上.売上日>='2005-12-1'; |
テーブルを結合した更新クエリは、ACCESSとPostgreSQLで書式が相当に異なります。
MS ACCESSからPostgreSQLへ移行するに戻る TOPに戻る