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

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

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

1977閲覧

【SQL】EXISTSで共通点があるレコードに対してT/Fを割り振る

KageChanMan

総合スコア9

PostgreSQL

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

SQL

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

1グッド

0クリップ

投稿2016/04/20 02:56

編集2016/04/20 07:00

初投稿になります。自分で考えながらやっておりますが、
とある雑誌で当サイトの事を知り、ものは試しと投稿してみました。
自分の作業用メモをそのまま記載するため、至らないところあるかと思いますが、
皆様の知恵をお借りしたいです。どうぞよろしくお願いいたします。

TABLE S の
hogeカラムに以下のパターンで値が入っている。
先頭のT/Fは期待値。

【パターン1】
T 0001
T 00010002
T 000100020001
T 000100020002
T 00010003
T 000100030001
F 0003

【パターン2】
T 00010002
T 000100020001
T 000100020002
T 00010003
T 000100030001
F 00010004
F 00020002

【パターン3】
F 000100020001
F 000100020002
T 00010003
T 000100030001

【パターン4】
F 000100020001
F 000100020002
F 000100030001
F 000100030002

【パターン5】
T 0001
T 000100020002
T 000100030001

【パターン5】
T 0001
T 0001
F 000300030001
T 0004
T 000400030001

補足:
1.4桁,8桁,12桁の3パターンしかない。
2.hogeカラムは文字列列で昇順になっている。
3.プライマリーのシーケンスナンバーが各レコードに割り振られている。
(なので、自分自身を含めない。ということも出来る)

やりたいこと:
「1~4桁目が祖」、「5~8桁が親」、「9~12桁が子」と仮定すると、
祖や親から見て、自分の子孫に同族がいる場合は、自分と相手双方ともTrue。
その他はFalse。を抽出したい。
(EXISTS以外の実現方法や、EXISTSの中のWHERE句のアイデアをいただきたいです)

現状:
SELECTの中でEXISTSを使って....SとEXISTSで参照してるSテーブルをS2と別名をつけて、、、、
と試行錯誤しているもののピンとくる条件(WHERE句)がない。(実力不足)

退会済みユーザー👍を押しています

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2016/04/20 06:07

余談ですが、この構造だといちいち比較のために文字列の切り出し処理を行わないといけないのでクエリー実行速度が遅そうな気がします。単純比較できるように4桁ごとに分割したカラムになるよう構造を見なおしたほうがいいかもしれません。
KageChanMan

2016/04/20 06:41

>m6u 様 ご回答くださいまして、ありがとうございます。 またアドバイスもくださり、助かります。大きなプロジェクトの根底のデータベースのため、影響が計り知れず、やむを得ずこのような構成になっております....
退会済みユーザー

退会済みユーザー

2016/04/20 09:43

データが膨大になるようであれば、「式に対するインデックス」を設定して速度低下を少しでも抑える工夫ができます。9.5のドキュメント→http://www.postgresql.jp/document/9.5/html/indexes-expressional.html
guest

回答2

0

CASE式のススメの 6.テーブル同士のマッチング
http://www.geocities.jp/mickindex/database/db_case.html#LocalLink-match
を見ながら、Oracle11gR2で作ってみました

sql

1with t(Val) as( 2select '0001' from dual union all 3select '00010002' from dual union all 4select '000100020001' from dual union all 5select '000100020002' from dual union all 6select '00010003' from dual union all 7select '000100030001' from dual union all 8select '0003' from dual) 9select Val, 10case (select count(*) from t b 11 where substr(b.Val,1,Least(Length(b.Val),Length(a.Val))) 12 = substr(a.Val,1,Least(Length(b.Val),Length(a.Val))) 13 and RowNum <= 2) 14when 1 then 'F' else 'T' end as TF 15 from t a 16order by Val; 17 18Val TF 19------------ -- 200001 T 2100010002 T 22000100020001 T 23000100020002 T 2400010003 T 25000100030001 T 260003 F 27

投稿2016/04/22 10:17

AketiJyuuzou

総合スコア1147

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

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

0

ベストアンサー

PostgreSQL使ったことないのでこちらで関数を調べながらクエリを書いてみました。
実行していないのでそのまま通るかわかりませんが、こういうクエリではどうですか?

SQL

1select 2case (A.x + B.x + C.x) 3when 1 then 'F' 4else 'T' 5END 6,A.hoge 7,B.hoge 8,C.hoge 9from (select case when hoge is null then 0 else 1 end x, hoge from Hoge where char_length(hoge) = 4) A 10cross join (select case when hoge is null then 0 else 1 end x, hoge from Hoge where char_length(hoge) = 8) B on (A.hoge = substring(B.hoge,1,4)) 11cross join (select case when hoge is null then 0 else 1 end x, hoge from Hoge where char_length(hoge) = 12) C on (A.hoge = substring(B.hoge,1,4) OR (B.hoge = substring(C.hoge,1,8))) 12;

投稿2016/04/20 03:46

編集2016/04/20 03:47
rysh

総合スコア874

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

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

KageChanMan

2016/04/21 00:04

>rysh様 ご回答くださいまして、ありがとうございました。 cross joinというものは存じあげず、勉強になりました。 引き続き、またご縁がございましたら、ご回答のほどお願いいたします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問