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

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

ただいまの
回答率

90.48%

  • PostgreSQL

    1105questions

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

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

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 4,686

pescatore

score 1

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'
            )
        )
    )

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • 退会済みユーザー

    2016/04/01 12:27

    こちらの質問が他のユーザから「やってほしいことだけを記載した丸投げの質問」という指摘を受けました
    「質問を編集する」ボタンから編集を行い、調査したこと・試したことを記入していただくと、回答が得られやすくなります。

回答 2

checkベストアンサー

+1

質問文にあるように
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 15:19

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

    キャンセル

0

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/04/01 15:20

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

    キャンセル

関連した質問

同じタグがついた質問を見る

  • PostgreSQL

    1105questions

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