2016-08-22 16 views
1

私はFirebirdというクエリをPostgreSQLコードに書き直す必要があります。FirebirdからPostgreSQLへのクエリの翻訳

SELECT TRIM(RL.RDB$RELATION_NAME), TRIM(FR.RDB$FIELD_NAME), FS.RDB$FIELD_TYPE 
FROM RDB$RELATIONS RL 
    LEFT OUTER JOIN RDB$RELATION_FIELDS FR ON FR.RDB$RELATION_NAME = RL.RDB$RELATION_NAME 
    LEFT OUTER JOIN RDB$FIELDS FS ON FS.RDB$FIELD_NAME = FR.RDB$FIELD_SOURCE 
WHERE (RL.RDB$VIEW_BLR IS NULL) 
ORDER BY RL.RDB$RELATION_NAME, FR.RDB$FIELD_NAME 

私はSQLを理解し、誰かがこれで私を助けた場合、それは本当に素晴らしいことだろうかRDB$RELATIONSのように、このシステムテーブルなどで動作するようには考えて、持っていませんが、このテーブルの説明とさらにいくつかのリンクはOKになります。

クエリのこの作品は、C++コードである、と私はこれをやろうとしているとき:

RDB $ RELATIONSが存在しません:それはと書い

pqxx::connection conn(serverAddress.str()); 
pqxx::work trans(conn); 
pqxx::result res(trans.exec(/*there is this SQL query*/));//and there is a mistake 

+0

すべての正直なところ、現在のクエリは、テーブル名と列名の構文を除き、有効なSQLのように見えます。テーブル_schema_(テーブル名とカラム名/タイプ)を投稿できますか? –

+0

@TimBiegeleisen質問文にいくつか変更を加える。 – koshachok

答えて

3

Postgresはシステムのコンテンツに関する情報を格納する別の方法があります。これはSystem Catalogsと呼ばれます。

Firebirdでは、クエリは基本的に、すべてのスキーマ内のテーブルのすべての列に対して、フィールドデータ型にマップされる追加のInteger列を持つ行を返します。同様のpg_catalogスキーマ何かにシステムテーブルを使用してPostgresので

は、このクエリを使用して達成することができます:クエリの上

SELECT 
    TRIM(c.relname) AS table_name, TRIM(a.attname) AS column_name, a.atttypid AS field_type 
FROM pg_class c 
LEFT JOIN pg_attribute a ON 
    c.oid = a.attrelid 
    AND a.attnum > 0 -- only ordinary columns, without system ones 
WHERE c.relkind = 'r' -- only tables 
ORDER BY 1,2 

は、同様のシステム・カタログを返しません。 を除外する場合はを除き、別のJOINをpg_namespaceに、where句をpg_namespace.nspname <> 'pg_catalog'に追加する必要があります。これは、システムカタログが格納されているスキーマであるためです。

代表番号の代わりにデータ型名を表示したい場合は、pg_typeにJOINを追加します。ビューのコレクションで構成されてい


情報スキーマ。ほとんどの場合、ビューの背後にあるSQLクエリ全体を必要としないので、システムテーブルを使用するとパフォーマンスが向上します。ビューの定義を検査することができます。出力を形成するために使用されるテーブルと条件を開始するだけです。

+0

あなたは私に助けてくれるでしょうか?[質問例](http://pastebin.com/z03gGjy2)、助けてもらえますか?私のような人形のための特別なリンク/書籍/ etc) – koshachok

+0

@koshachokあなたはすでにソースを持っています情報 - システムカタログと情報スキーマ。とにかく、さらに助けが必要な場合は、別の質問を投稿してください。 –

+0

でも、Firebirdの名前とPostgresの名前をどのように関連付けることができますか? – koshachok

3

私はあなたがinformation_schemaを探していると思います。

テーブルはここにリストされています:https://www.postgresql.org/docs/current/static/information-schema.html

だから例えば、あなたが使用することができます。

select * from information_schema.tables; 
select * from information_schema.columns; 
関連する問題