質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Q&A

解決済

1回答

5148閲覧

PostgreSQLで外部結合したテーブルからデータを抽出したい

macharu

総合スコア24

PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

0グッド

1クリップ

投稿2015/02/23 05:42

下記のようなSQL文でデータを抽出したいのですが上手くできません。

SELECT dtb_order.order_id FROM dtb_order LEFT JOIN dtb_skip_revision ON dtb_order.order_id = dtb_skip_revision.order_id WHERE NOT dtb_skip_revision.skip_month = '201502'

dtb_orderは注文情報、
dtb_skip_revisionは注文に関するオプション情報で、オプションが設定された場合のみdtb_orderの注文IDと紐付いたレコードが挿入されます。

dtb_orderに対して、dtb_skip_revisionを左外部結合しているため、
WHERE句を使わなければdtb_orderのデータは全件表示されます。

ただし下記のWHERE句を追加すると、

WHERE NOT dtb_skip_revision.skip_month = '201502'

dtb_orderの中でdtb_skip_revision上にIDの存在するデータしか表示されません。

dtb_skip_revision.skip_monthが'201502'でないデータ全てを抽出したいのですが、
dtb_orderの中でdtb_skip_revisionにIDが存在しないデータも除外されてしまいます。

dtb_skip_revision.skip_monthの中で'201502'でないデータを除外しつつ、
残りのdtb_orderのデータを全て抽出するにはどのようにすればいいでしょうか。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

Postgreに限らず、SQLは三値論理で動いています。LEFT JOINした際に、右側のテーブルに対応する値がないものはNULLとなって、普通にdtb_skip_revision.skip_month = '201502' のような比較をしてしまうとTRUEでもFALSEでもない状態となってしまいます(NOTで反転させてもTRUEになりません)。

WHERE dtb_skip_revision.skip_month IS NULL OR dtb_skip_revision.skip_month <> '201502' というように、明示的にIS NULLを書いてNULLの場合も拾いましょう。

投稿2015/02/23 05:53

maisumakun

総合スコア145121

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

macharu

2015/02/23 16:49

回答いただきありがとうございます。 これで期待通りの結果を得ることができました。 自動的にNULLになるんですね。勉強になります。 これで解決済みにさせていただきます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問