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

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

ただいまの
回答率

90.40%

  • SQL

    2674questions

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

  • PostgreSQL

    1205questions

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

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

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 891

KageChanMan

score 1

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

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句)がない。(実力不足)

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

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

  • m6u

    2016/04/20 15:07

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

    キャンセル

  • KageChanMan

    2016/04/20 15:41

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

    キャンセル

  • m6u

    2016/04/20 18:43

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

    キャンセル

回答 2

+15

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

with t(Val) as(
select '0001'         from dual union all
select '00010002'     from dual union all
select '000100020001' from dual union all
select '000100020002' from dual union all
select '00010003'     from dual union all
select '000100030001' from dual union all
select '0003'         from dual)
select Val,
case (select count(*) from t b
       where substr(b.Val,1,Least(Length(b.Val),Length(a.Val)))
           = substr(a.Val,1,Least(Length(b.Val),Length(a.Val)))
         and RowNum <= 2)
when 1 then 'F' else 'T' end as TF
  from t a
order by Val;

Val           TF
------------  --
0001          T
00010002      T
000100020001  T
000100020002  T
00010003      T
000100030001  T
0003          F

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

checkベストアンサー

0

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

select 
case (A.x + B.x + C.x)
when 1 then 'F'
else 'T'
END
,A.hoge 
,B.hoge 
,C.hoge 
from (select case when hoge is null then 0 else 1 end x, hoge from Hoge where char_length(hoge) = 4) A
cross 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))
cross 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)))
;

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2016/04/21 09:04

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

    キャンセル

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

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

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

  • SQL

    2674questions

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

  • PostgreSQL

    1205questions

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