2012-04-16 6 views
1

Postgres libpq sqlには、関数があります。PQfnumber:指定された列名に関連付けられた列番号を返します。PostgreSQL libpq:PQNumber列のエイリアス

私は選択を持っているとしましょう:

select a.*, b.* from a, b where a.id = b.id 

今私は

number = PQfnumber(pgresult, "a.id"); 

を呼ぶかどうかは-1を返します。

正しい方法で呼び出すことです:a.id.の位置を返します

number = PQfnumber(pgresult, "id"); 

では、b.idの列番号を取得するには、関数をどのように呼び出す必要がありますか?その周りに 唯一の方法は、異なる選択を書くようだ:

select a.id as a_id, a.*, b.id as b_id, b.* from a, b where a.id = b.id 

number = PQfnumber(pgresult, "b_id"); 

この周りに他の方法?

答えて

1

いいえ、あなたは正しい方法を見つけました。

もちろん、内部結合(例コードのように)でa.id = b.idを使用すると、どの列を見ているのでしょうか?また、ではないの理由は、すべてのテーブルの主キーとしてid列を持つことが必要です。多くの表に1列の整数キーがある場合でも、主キーを保持する列の名前を一貫して指定すると、より簡潔で効率的な構文のJOIN ... USINGが使用可能になります。

0

あなたは、このように構築し使用する場合:あなたはクエリは、このような列の別名含まれている必要があります

number = PQfnumber(pgresult, "a.id"); 

:あなたはあなたのコード内のあいまいさを持っている

SELECT a.id AS "a.id", b.* FROM a, b WHERE a.id = b.id; 

を、 PL/pgSQL言語でこのようなクエリを試してみると、42702: ambiguous_column例外を受け取ることになります。

ここでは唯一の方法があります。クエリのすべての野心的な列に対して一意のエイリアスを付ける必要があります。実際、すべての列にエイリアスを付けるのは良い方法ですが、いつもそうしています。

関連する問題