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

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

新規登録して質問してみよう
ただいま回答率
85.48%
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

解決済

2回答

5234閲覧

【SQL】betweenの検索範囲をテーブルの値から取って来たい

keisutera

総合スコア7

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グッド

0クリップ

投稿2019/01/12 15:09

親テーブルから取得するデータのIDの範囲をbetweenで指定するのですが、その値の範囲(START_ID, END_ID)が参照テーブルに不連続に設定されています。
そして、参照テーブルで指定されているIDに該当するデータには○をつけたいです。

使用している言語はPostgreSQL 9.3です。

検索したい値の範囲が設定されたテーブル
・参照テーブル
|ID|START_ID|END_ID|
|:--|:--|
|1|2|4|
|2|7|10|
|3|15|20|

自分で考えた際は参照テーブルをFROM句に書いて、BETWEEN句の開始/終了を参照テーブルの項目を指定していたのですが、これだとテーブルが結合されてしまい、不要なデータができてしまいます。(当然ですが)

SQL

1--自分で考えたSQL 2SELECT 親テーブル.* , 3 CASE 4 WHEN 親テーブル.ID BETWEEN 参照テーブル.START_ID AND 参照テーブル.END_ID THEN '○' 5 ELSE '' 6 END AS FLAG 7FROM 親テーブル, 参照テーブル

副問合せをするにも、STARTとENDの2つの項目を指定する方法がわかりません。
(各々の項目に対して副問合せをしても、データ毎のひも付きがわからないためエラーとなる)

ご教授をお願いします。

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

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

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

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

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

Orlofsky

2019/01/13 00:27

質問に親テーブルの定義情報がないのでコメントが付きにくいです。質問にCREATE TABLE文と数件で良いからテーブルに存在するデータのINSERT文と希望するSELECT結果も載せた方が適切なコメントが付き易いです。
seastar3

2019/01/13 00:43

やりたい処理は、該当レコードの抽出でしょうか、検出フラグへの埋め込みでしょうか。
guest

回答2

0

基本的な抽出は、

SQL

1SELECT 親テーブル.ID 2FROM 親テーブル, 参照テーブル 3WHERE 親テーブル.ID BETWEEN START_ID AND END_ID

のようなコードです。
更新する場合は、上記のコードを副問い合わせとして、

UPDATE 親テーブル SET 該当フラグ = true WHERE ID IN (SELECT 親テーブル.ID FROM 親テーブル, 参照テーブル WHERE 親テーブル.ID BETWEEN START_ID AND END_ID)

のようなコードでできます。

投稿2019/01/13 00:48

seastar3

総合スコア2285

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

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

keisutera

2019/01/14 14:21

回答ありがとうございます。 質問時にやりたい処理は何かを明確に記載したほうが良い旨のコメントもありがとうございます。
guest

0

ベストアンサー

参照テーブルをFROM句に書いて、BETWEEN句の開始/終了を参照テーブルの項目を指定していたのですが、これだとテーブルが結合されてしまい、不要なデータができてしまいます

以下でどうでしょうか。

SQL

1select * 2 , case when c.id is not null 3 then '○' else '' 4 end as flag 5from 親テーブル as p left join 参照テーブル as c 6 on p.id between c.start_id and c.end_id

副問合せをするにも、STARTとENDの2つの項目を指定する方法がわかりません。

相関副問合せだと以下のようになります。

SQL

1select * 2 , case when exists(select 1 from 参照テーブル where p.id between start_id and end_id) 3 then '○' else '' 4 end as flag 5from 親テーブル as p

投稿2019/01/13 00:43

sazi

総合スコア25173

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

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

keisutera

2019/01/14 14:24

回答ありがとうございます。 テーブル結合の条件としてbetween句を使用するのですね。 私が欲しかった回答に近かったため、ベストアンサーとさせていただきます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問