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

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

ただいまの
回答率

90.52%

  • MySQL

    5840questions

    MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

  • SQL

    2383questions

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

サブクエリ以外で子テーブルの情報有無を抽出する方法について

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 62

rytskywlkr

score 1

以下のようなテーブルがあるとします。

親テーブル

ID
1 a
2 b

子テーブル

ID 親ID 登録日
1 1 2018-1-1
2 1 2020-1-1
3 2 2019-1-1
4 2 2021-1-1

上記から登録日を期間を条件に親テーブルのIDと値を抽出したいです。
そのために以下のサブクエリを利用するSQLを作成しましたが、性能的に問題があると考えています。

SELECT
  a.ID, 値
FROM
  親テーブル a,
  (SELECT b.親ID ASID FROM 子テーブル b WHERE b.登録日 BETWEEN %条件% AND %条件% GROUP BYID) c
WHERE
 a.ID = c.親ID

別の方法として親テーブルに登録日_FROM、登録日_TOというカラムを付与し、
こちらを条件にする方法も考えました。
(値は子テーブルからトリガーなどで更新する想定)

ID 登録日_FROM 登録日_TO 
1 a 2018-1-1 2020-1-1
2 a 2019-1-1 2021-1-1

以下質問となります。

  1. サブクエリを利用せずにSQLを組むことは可能でしょうか。
  2. 検索の性能を上げるために親テーブルに子テーブルの情報を保持するような設計は

どのような検索をすればよいかわからず、こちらに質問いたしました。
ご教授いただけますと幸いです。

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 2

checkベストアンサー

+1

以下はサブクエリですけど、そんなに遅くなるかな。

SELECT  *
FROM  親テーブル
WHERE ID in (
        SELECTID FROM 子テーブル WHERE 登録日 BETWEEN %条件% AND %条件%
      )


遅いとしたら、インデックスが適切では無いと思われます。

親テーブルの件数が子テーブルに比してかなり少ないなら、インデックスが適切な場合、相関問い合わせによるexists判定が一番高速になる可能性があります。

SELECT  *
FROM  親テーブル as t1
WHERE exists (
        SELECT 1 FROM 子テーブル WHERE 登録日 BETWEEN %条件% AND %条件% andID=t1.ID
      )

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/10/14 13:53

    ご回答ありがとうございます。
    仰る通り、どこまで遅くなるかというところはありますが、
    サブクエリを使わずに実現できる方法があればと思い質問させていただきました。

    キャンセル

  • 2018/10/14 16:15

    追記しました。

    キャンセル

  • 2018/10/14 16:19

    親テーブルの件数に合わせるんですから、合わせる為の整形を行うならサブクエリーを使うしかありませんね。

    キャンセル

  • 2018/10/16 09:15

    なるほどです。仰る通りですね。
    ありがとうございます。

    キャンセル

+1

普通に内部結合で実現できることだ思いますが?
相関サブクエリではないのでそんなに性能的に差が出るとも思えません。

SELECT 親テーブル.*
FROM
 親テーブル INNER JOIN 子テーブル ON 親テーブル.ID = 子テーブル.親ID
WHERE
 登録日 Between %条件% And %条件%;

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/10/14 14:34

    ご回答ありがとうございます。
    内部結合だと条件に合致する登録日の件数分取得されてしまいます。
    Disctinctすればいいとは思いますが、結合する前に絞る方法があるとより良いと考えています。

    キャンセル

  • 2018/10/14 14:59

    なら、サブクエリしかないんじゃないかな。
    性能を気にしているようですが、サブクエリで遅いといわれているのは相関サブクエリですが、そうではないので気にすることはないと思います。

    キャンセル

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

  • ただいまの回答率 90.52%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

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

  • MySQL

    5840questions

    MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

  • SQL

    2383questions

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