PostgreSQLでサブクエリーをJOINする方法
- PostgreSQLでサブクエリーをJOINする方法について学びましょう。
- PostgreSQLのバージョンによっては、特定のJOIN方法がエラーを引き起こすことがあります。
- 他の書き方を使って同じ結果を得る方法もあります。
- ベストアンサー
PostgreSQLでサブクエリーをJOINする方法
たとえば、 select A.field1, B.field1 from (select field1 from table1 where field2='x') A, (select field1 from table2 where filed2='y') B where A.field2=B.field2; のようなことをしたいのですが、 Oracleだとこの方法でデータを取ってこれるのですが、PostgreSQLだとエラーで返ってきてしまいます。 PostgreSQLのバージョンは6.5.3です。 バージョンが上がると上記の書き方も通るようになるのでしょうか? また、上記の書き方と同じ意味を持つ他の書き方をご存知でしたら教えてください。よろしくお願いします。
- ro-ro-ro
- お礼率100% (2/2)
- その他(プログラミング・開発)
- 回答数1
- ありがとう数1
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
提示されている例だと何も選択される行はありませんが…。(^^; というツッコミは別にしてこれを書きかえてみると SELECT A.field1, B.field FROM table1 A, table2 B WHERE A.field2 = B.field2 AND A.field2 = 'x' AND B.field2 = 'y' となります。 カラムの選択条件(WHERE句)に副照会が必要でない限り、outer join等を駆使すれば大抵のものは副照会なしで書けると思います。
関連するQ&A
- PostgreSQLの「*」について・・?
こんにちわ, 今PostgreSQLを勉強しています。 たとえば, SELECT * FROM table where field ~ 'a'; とすると,tableテーブルからfieldに「a」が入っている項目を抜き出す,となります。 これに SELECT * FROM table where field LIKE '*a'; とすると,エラーが出てしまいます。 *(ワイルドカード)の使用はどのようなときに使用するのでしょうか。PostgreではLinuxとは違う使用をすると書いてあったのですが,よくわかりません。 よろしくおねがいします。
- ベストアンサー
- PostgreSQL
- joinの場合のテーブル名の別名の使用方法
select * from table1 a,table2 b where a.field1=b.field1; とできますが select * from table1 as a left join table2 as b on a.field1=b.field1; とできません。 joinの場合にテーブル名の別名を使う方法を教えてください
- ベストアンサー
- PostgreSQL
- INSERT文でフィールドの1つだけを他のテーブルから取ってきた値を入れたい
挿入するフィールドの内1つだけを他のテーブルから取ってきた値を使いたいのですが、 insert into table1 (field1, field2, field3) values('a', (select field2 from table2 where field4='xxx'), 'b'); Oracleだと↑の書き方でいけるのですが、PostgreSQL(6.5.3)だとエラーになってしまいます。 2回もDBにアクセスしにいくのはいやなので、1文で書きたいです。上記以外で他の書き方をご存知でしたら教えてください。よろしくお願いします。
- ベストアンサー
- その他(データベース)
- サブクエリーについて教えてください。
こんにちは!以下のようなことがサブクエリーを使用してできるか?他にどんな方法があるか、アドバイスをお願いします。 あるテーブル(TABLE)から2段階でデータをselectし、計算させたいのですが分かりません。 一段階目 select a,b,c,d,e,f from TABLE where a='A' and b='B' 二段階目(上記の結果を使って、ここからが分かりません) select c,d,e,sum(f) as 結果 from TABLE(?) group by c,d,e having e='E' やりたいことの概要: 1. a='A' and b='B'でデータを抽出 2. 1.で抽出したデータに対してグループ化して集計する これを一回で実行するにはどのようにしたら良いでしょうか?サブクエリーでできそうだと思い、いろいろ調べましたが、よく分かりませんでした。 よろしくお願いします。
- ベストアンサー
- SQL Server
- postgresのouter join(?)について
やまとです。 以下のようなテーブルと、そのデータが有ります。 a_table ============ id | a_name ---+---------- 1 | hanako 2 | taro b_table ============ id | b_name ---+---------- 1 | yamada select a_name,b_name from a_table a, b_table b where a.id = b.id 以上のようなselect文だと、以下の様に出ますが、 a_name | b_name -------+------- jo | koba 実際は、以下の様に結果を出したいのです。 a_name | b_name -------+------- jo | koba taro | ORACLEだと where a.id = b.id(+) で出ると思いますが、 Postgresではどのように表記したら良いのでしょうか? 教えてください。 宜しくお願いします。
- ベストアンサー
- その他(データベース)
- DELETEの操作で (PostgreSQL)
linux postgresql 8.4 で1行DELETEしたいのですが select * from table_a where a_key = 1400; で1件検索できても delete from table_a where a_key = 1400 returning *; としてもレコードが表示されません。 原因の調べ方を教えてもらえないでしょうか? よろしくお願いします。
- 締切済み
- PostgreSQL
- SQL シーケンスについて
Orcle8iを使用しています。 INSERT INTO SELECT で別のテーブルのデータを追加したいのですが、そのうち1つフィールドには、シーケンスオブジェクトで取得した値を入れたいと思っていますが、INSERT文が作れません・・・。 例えば ----------------------------- INSERT INTO TABLE1(FIELD1,FIELD2,FIELD3) SELECT --SELECT SEQ.NEXTVAL FROM DUAL??-- FIELD1_2, FIELD1_3 FROM TABLE2 WHERE FILED1_2='X'; ----------------------------- という場合、TABLE1のFIELD1に連番を入れたいのですが 書き方が分かりません。 http://www.okweb.ne.jp/kotaeru.php3?q=347146 上記URLの質問に、シーケンスのSELECT文を副問い合わせにして・・・という回答があったのですが、それもよく理解できませんでした・・・(T_T) シーケンスのSELECT文をどう埋め込めば良いのでしょうか? どなかた教えていただけませんか? よろしくお願いします。
- ベストアンサー
- その他(データベース)
- 実行計画HASH JOIN RIGHT OUTER
以下のようなSQLがあるとします。 ------------------------ SELECT * from (select * from TABLE-A where 条件色々) AA, TABLE-B BB where BB.x(+) = AA.x ------------------------ TABLE-Aの件数は非常に多く(例100万)、条件は複雑です。 TABLE-Bの件数は少ないです(例30件) この時、実行計画が HASH JOIN RIGHT OUTER TABLE ACCESS FULL TABLE-B のように出ましたが、どのように解釈すれば良いのでしょう? TABLE-Bは件数が少ないのでACCESS FULLでも問題ないでしょうか? HASH JOIN RIGHT OUTER のコストが高くなってて気になってます。 たとえば、この場合のより適切な実行計画ってありますか?
- ベストアンサー
- Oracle
- from...where を from...join..on にするには
以下のSQL文は from ... where ... で書かれていますが これを from ... join ... on ... で書き直したいのですが可能でしょうか? select X.col1, U.col1 from TABLE_X as X ,TABLE_U as U where U.REC_NO = (select B.REC_NO from TABLE_A as A, TABLE_B as B where A.ITME = B.ITEM and X.DATA = A.DATA fetch first 1 row only ) むずかしくしているのは、fetch first 1 row only なのですが これがないと where句のかっこのなかのselect文は複数の結果を返します しかし、その複数の結果はすべて同じものになることがデータ上保証されています 。 fetch first を除いて select distinct としても同じ結果となりますが パフォーマンスがひどく低下してしまいます。
- ベストアンサー
- その他(データベース)
- ちょっと見かけないinner joinについて
どなたか以下の構文について教えて下さい。 どこのDBMSで使用されるものなのでしょう? SELECT B.項目1, B.項目2, A.項目2, A.項目3 FROM ( ( SELECT * FROM Bテーブル WHERE 項目3>"1" ) B INNER JOIN ( SELECT * FROM Aテーブル WHERE 項目2=10 ) A ON B.項目1=A.項目1; 意味はわかるのですが、普通のinner joinとは違うもので。
- 締切済み
- その他(データベース)
お礼
うわ。確かに。 質問文のSQL文はこうかも。訂正。 select A.field1, B.field1 from (select field1, field2 from table1) A, (select field1, field2 from table2) B where A.field2=B.field2; 実は、文に明示していないフィールド名(たとえばfield3があったとしてfield3)はwhere文で使ってはいけない、という思い込みをしていたんです。今思うとバカです。解決しました。どうもありがとうございました。