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

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

ただいまの
回答率

90.50%

  • SQL

    2460questions

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

  • PostgreSQL

    1097questions

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

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

解決済

回答 2

投稿 編集

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

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.50%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

  • 解決済

    MySQLのテーブル内に行が存在しているかどうか確認する一番いい方法は?

    テーブル内に行が存在しているかどうか確認したいです。 MySQLを使って確認したい場合、以下の2つのうちのどちらを使った方がいいでしょうか。 SELECT COUNT(*) A

  • 解決済

    EXISTSでIS NULLを使う時の処理

    お世話になっております。 PostgreSQLを使っています。 以下のようにEXISTSでhogeinの中身がNULLの時trueの値を取得したいのですが実際にSQLで出力してみる

  • 解決済

    mysql 早いSQLの書き方

    下記のようなSQLがある場合、SQLを編集し早くするアドバイスを頂けますでしょうか?  下記innner joinをEXISTSで参照する事により解決するという情報を得ましたがやり

  • 解決済

    "SELECT 1 AS one"の使い方

    よろしくお願いします。 Railsで開発しておりまして、 exists? を使う機会があり、 使った際の発行されるSQLを見ていた所 select 1 AS on

  • 解決済

    条件付きINSERT

    お世話になっております。 MySQLで、テーブルAに格納されているログデータのある賞品番号のカウント数が、テーブルBに格納されているその賞品の規定値未満だった時だけ、テーブル

  • 解決済

    WHERE句で3カラム中2カラムに一致する場合のSQL式

    とある検索ページを作成中です。 その中に◯◯且つ△△というフォームがあります。 例えば◯◯と△△の趣味検索が出来るフォームがあり、趣味を3つ登録出来るテーブルがあったとし、

  • 受付中

    チェックボックスでの投稿と検索

    当方rails 初心者です。 やりたいこと: 今、自分が描いた漫画を投稿して、みんなで見ることができるwebアプリを作成しています。 そこで、投稿する際にその漫画のジャン

  • 受付中

    MySQLでのパフォーマンスについての質問です

    前提・実現したいこと MySQLでスロークエリーが発生しています。以下のようなクエリを叩いたときに重いので有効なindexを教えていただきたいです。 SELECT * FROM

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

  • SQL

    2460questions

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

  • PostgreSQL

    1097questions

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