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

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

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

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

Q&A

解決済

2回答

21063閲覧

Postgresqlにて複数テーブルの値を抽出条件に指定する方法

pescatore

総合スコア7

PostgreSQL

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

0グッド

0クリップ

投稿2016/04/01 03:10

編集2016/04/01 03:30

Postgresqlを使用しています。
基礎は多少学びましたがほぼ素人です。
下記の事項を実現したく色々調べましたがイマイチわからなかったのでご教授下さい。

テーブルA
column-A1(テーブルBと紐付け)
column-A2
column-A3
column-A4
column-AA1(時間)
column-AA2(時間)

テーブルB
column-B1(テーブルBと紐付け)
column-BB1(年月日)
column-BB2(年月日)

取得対象
テーブルA
column-A1
column-A2
column-A3
column-A4

抽出条件
指定時刻がテーブルA column-AA1(時間)~column-AA2(時間)の間に含まれる
もしくは
指定時刻がテーブルA column-AA1(時間)~column-AA2(時間)の間に含まれ、指定日がテーブルB column-B1(年月日)~column-B2(年月日)の間に含まれる

そこで下記のSQLを作成し実行しましたが年月日を含んだデータを抽出出来ない状態です。

SELECT
テーブルA.column-A1,
テーブルA.column-A2,
テーブルA.column-A3,
テーブルA.column-A4,

FROM
テーブルA,
テーブルB

WHERE
(
('05:00' < '23:00'
and (テーブルA.column-AA1 >= '05:00' and テーブルA.column-AA1 <= '23:00' or テーブルB.column-BB1 = '2016/04/01' and テーブルB.column-BB2 = '2016/04/01')
)
or ('23:00' > '05:00'
and (
テーブルA.column-AA1 between '23:00' and '23:59'
or テーブルA.column-AA1 between '00:00' and '05:00'
)
)
)

解り辛い文面で申し訳ありませんが、修正箇所、アドバイス等ご教授お願い致します。

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

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

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

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

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

guest

回答2

0

ベストアンサー

質問文にあるように
FROM テーブルA, テーブルB
と書いてしまうと、テーブルAの全行とテーブルBの全行を掛けあわせたレコードの中から抽出する形になります。

テーブルAとBの関係性がよくわからないのですが、仮にテーブルAが従、テーブルBが主だとすると、
FROM テーブルA RIGHT JOIN テーブルB ON テーブルA.column-A1 = テーブルB.column-B1
とすればテーブルBの全行に対してcolumn-B1に関係するテーブルAの行が結合されます。

テーブルの結合に関しては:

7.2. テーブル式
http://www.postgresql.jp/document/9.5/html/queries-table-expressions.html

また、年月日や時刻をどのデータ型を使ってらっしゃるでしょうか。
日付はDATE型とTIMESTAMP型、時刻はTIME型というのがあり、TIMESTAMPとTIMEにはタイムゾーンありとなしのものがあります。
文字列型(VARCHAR(n)やTEXT)でやることもできますが、フィットするデータ型を使うとSQL実行の効率も良くなります。

8.5. 日付/時刻データ型
http://www.postgresql.jp/document/9.5/html/datatype-datetime.html

投稿2016/04/01 05:58

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

pescatore

2016/04/01 06:19

ご回答ありがとうございます。 テーブルA LEFT JOIN テーブルB ON テーブルA.column-A1 = テーブルB.column-B1 をする事で解決致しました。 データ型についてもご教授いただきありがとうございます。 本件は全てVARCHARでしたが次回以降の参考にさせていただきます。
guest

0

投稿2016/04/01 04:22

MasafumiOkamoto

総合スコア254

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

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

pescatore

2016/04/01 06:20

ご回答ありがとうございました。 outer joinについて調べ、無事解決致しました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問