- ベストアンサー
データベースの結合について
データベースAとBがあり。 データベースAには基本となるデータが入力されています。 id name flag a test 0 b aaaa 1 c ghic 0 データベースBにはデータベースBと同様のIDが入っています。 id pre a ddd このようなデータベースの場合、データベースBに入っているものを 1として表示したい場合はどのようなSQL文にしたらいいのでしょうか?? 出力したいDB例 id name flag b_flag a test 0 1 b aaaa 1 c ghic 0
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
PostgresSQLは使ったことないですけど、case文は使用可能でしょうか? taka451213さんのSQLを実行すると、b_flagには、 テーブルBに存在しない場合・・・null テーブルBに存在する場合・・・null以外の値(id) が表示されると思います。 ここで、null以外のものを1に変更します。 SELECT A.id, A.name, A.flag, CASE WHEN B.id IS NULL THEN 0 ELSE 1 END AS b_flag FROM A LEFT JOIN B ON A.id = B.id こんな感じでできないでしょうか? (Bテーブルに存在しないものは0として表示されます) 試してないので怪しいですけど…。
その他の回答 (5)
- taka451213
- ベストアンサー率47% (436/922)
こんばんは。 取得結果はどんな感じになりました? 外部結合になってませんでしたか? b_flagのカラムにBのidが(あれば)出てきてると思うのですが・・・。 テスト環境がないので自信ないですけど・・・。 (^^ゞ
お礼
b.idのカラムは出てきました。ありがとうございます。
- taka451213
- ベストアンサー率47% (436/922)
こんにちは。 PostgreSQLのSQLを調べてみました。 SELECT A.id, A.name, A.flag, B.id as b_flag FROM A LEFT JOIN B ON A.id = B.id これでどうですか?自信ないです・・・ (^^ゞ
お礼
以前も丁寧に教えていただきましたよね? ありがとうございます。 上記の方法で試してみたのですが、、、 フラグを立てることはできませんでした。
- taka451213
- ベストアンサー率47% (436/922)
こんにちは。 PostgreSQL自体はよくわかってないのですが・・・、 ここでおっしゃってるデータベースというのは、テーブルレベルですか? スキーマレベル? データベースのインスタンス自体が別物(DBLINKが必要)というレベルですか? 例えばテーブルA.Bがあった場合、Bにも存在するかどうかを判定するだけなら、 SELECT A.id, A.name, A.flag, B.id as b_flag FROM A, B WHERE A.id = B.id(+) ORACLEのSQLです・・・。 これでテーブルAとBの両方に存在する「id」だけが「b_flag」に出力されます(BになければNULL)。 PostgreSQLのSQLが書けないので、他の方にお任せします。 また、テーブルレベルでない場合(スキーマやデータベースインスタンス)、そのように置き換えてください。 それから出力が「B.id」なので、「0or1」に変更(OracleではDECODEなどを使いますが・・・)してください。 以上参考まで・・・。 (^^ゞ
補足
すみません。データベースではなくテーブルです。 テーブルAとテーブルBという形になります。 上記のようにやってみましたが、うまくいきませんでした。。。 やはり、オラクルとは少し違うようですね。 ありがとうございました。
- kusukusu
- ベストアンサー率38% (141/363)
よく読むと全然違ってました。 > データベースBに入っているものを1として表示したい これどういう意味ですか?
補足
DB(A) id name flag a test 0 b aaaa 1 c ghic 0 DB(B) d pre a ddd 結合後のDB d name flag b_flag a test 0 1 b aaaa 1 c ghic 0 表示の仕方が悪かったです。 上記のようにデータベースBにあるものを b_falg = 1となるようにしたいのです。 ないものは0でもNULLでもかまわないのですが。。。
- kusukusu
- ベストアンサー率38% (141/363)
SELECT id,name,flag,(SELECT pre FROM B where id=A.id) as 1 from A
お礼
無事に1と0を表示することができました。 ありがとうございました。