• ベストアンサー

組み合わせの検索方法

数字の組み合わせ毎に情報を管理しようと思うのですが、 以下のようなテーブル構成を考えました。 CREATE TABLE COMBINATIONS ( COMBINATION_ID NUMBER, INFO VARCHAR2(100) ); CREATE TABLE ELEMENTS ( COMBINATION_ID NUMBER, ELEMENT_NUMBER NUMBER ); 例としては: <COMBINATIONS> COMBINATION_ID INFO -------------- ---- 1 ABC 2 DEF 3 GHI <ELEMENTS> COMBINATION_ID ELEMENT_NUMBER -------------- -------------- 1 1 1 2 2 100 2 200 3 100 3 200 3 300 です。 1,2の組合せの場合→ABC 100,200の組合せの場合→DEF 100,200,300の組合せの場合→GHI のような具合です。 このように、数字の組合せを条件にINFOを 取得するには、どのようなSQL文がよいでしょうか。 データベースはOracleです。

質問者が選んだベストアンサー

  • ベストアンサー
  • taka_tetsu
  • ベストアンサー率65% (1020/1553)
回答No.4

>2.仮想テーブルのCOMBINATION_IDで<ELEMENTS>を検索し、 >組み合わせ全てを持ち、組み合わせ以外を持たない >COMBINATION_IDで第2仮想テーブルを構成する。 確かにできますけど・・・ 数が不定だと、ここのSQLをどうするかなんですよね。 ここの抽出方法が確定するんでしたらインラインクエリー使わなくても普通にSQLだけで抽出できます。 たとえば、100,200の2つの場合、 select INFO from COMBINATIONS, ELEMENTS where COMBINATIONS.COMBINATION_ID = ELEMENTS.COMBINATION_ID group by INFO having sum(decode(ELEMENT_NUMBER, 100, 1, 200, 1, 0)) = 2; とかすればできますよ。 #decodeのところがねぇ・・・

iwashimizu
質問者

お礼

とりあえずCOMBINATION_IDがわかればよいので、 回答の内容を単純化すると SELECT COMBINATION_ID FROM ELEMENTS GROUP BY COMBINATION_ID HAVING SUM(DECODE(ELEMENT_NUMBER,100,1,200,1,0)) = 2; となりましたが、これではCOMBINATION_ID=3のケースも 検索結果に含まれてしまうのですが、HAVING句を SUM(DECODE(ELEMENT_NUMBER,100,1,200,1,0)) = COUNT(*) として、正しい結果が得られるようになりました! 考え方は、100と200の組合せを検索したい場合、 DECODEを使用して100->1,200->1,その他->0として 一致件数をSUMして、それらが組合せ内の要素数 (COUNT)と一致する、という条件で検索する、という 方法です。前提として組合せ内に同じ要素が存在しない、 というのが必要なので、ELEMENTS表に一意キー (COMBINATION_ID,ELEMENT_NUMBER)を作成する必要が あります。 ありがとうございます。

その他の回答 (3)

  • binko1
  • ベストアンサー率0% (0/1)
回答No.3

仮想テーブルを経由すれば、1SQLでも可能な気がします。 1.目的のELEMENT_NUMBERを持つCOMBINATION_IDをユニークに取り出し仮想テーブルとする。 2.仮想テーブルのCOMBINATION_IDで<ELEMENTS>を検索し、組み合わせ全てを持ち、組み合わせ以外を持たないCOMBINATION_IDで第2仮想テーブルを構成する。 3.第2仮想テーブルと<COMBINATIONS>を結合する。 (結果は単一ではない) 文法は面倒なので省略。 他にも方法はありそうですが、実際に使用することが目的なら、table自体を変えたほうがよいように思えます。

iwashimizu
質問者

お礼

2の部分でつまづきました。 「組み合わせ全てを持ち、組み合わせ以外を持たない」 の条件をWHERE句で書けませんでした。 No.4の回答にこの部分の補足がありそうなので、 よく見てみます。 ありがとうございました。

  • R-Fuji
  • ベストアンサー率40% (18/45)
回答No.2

私も無理だと思いますね。 以前にリレーショナルとして繋がっていないんではないでしょうか? 組み合わせが有限であれば、それを定義するテーブルを作りそれとリレーションすれば、”無い”部分をnullか何かで埋められると思いますが……。組み合わせが順不同であれば、これもえらいことになりますね(^_^;

iwashimizu
質問者

お礼

やっぱり難しいですかね。 組合せ要素数が有限であれば、COMBINATIONSの列に ELEMENT_NUMBER1,ELEMENT_NUMBER2...のように もって、INSERT時に必ず昇順で格納すればいいかとは 思ったのですが。ありがとうございます。

  • taka_tetsu
  • ベストアンサー率65% (1020/1553)
回答No.1

普通のSQLでは無理でしょう(^^;;;; 組み合わせの数の個数が不定なんで。 それに、 >100,200の組合せの場合→DEF >100,200,300の組合せの場合→GHI となると、100、200を選択したときにはそれ以外の 値を持つ結果(今回は300を持つGHI)を排除しないといけないわけですし。 #もちろん逆はできますよ。DEFから100,200を求めるのは。

iwashimizu
質問者

お礼

やっぱり難しいですかね。ありがとうございます。

関連するQ&A

  • Yahoo! JAPAN ID の一部しか分からない場合

    Yahoo! JAPAN IDで出品者を検索したいのですが、Yahoo! JAPAN IDの全部を覚えておらず、一部分しかわからないのです。 例えば、abc123_def456ghiと言うIDだとしますと、def456(若しくはdef456ghi)は覚えているのですが その前後は分からないんです。 この場合、どうすればその文字を含むIDを検索できますか?

  • 二次元配列の分割

    よろしくお願いします。 $hoge = array( "one" => array("abc" => "100", "def" => "200", "ghi" => "300"), "two" => array("abc" => "110", "def" => "210", "ghi" => "310"), "three" => array("abc" => "120", "def" => "220", "ghi" => "320") "four" => array("abc" => "130", "def" => "230", "ghi" => "330") ); というような配列があったとき、 abcが110以下のときと、110より大きい場合で分割した配列を 用意したいと考えてます。 具体的には、 $hoge1 = array( "one" => array("abc" => "100", "def" => "200", "ghi" => "300"), "two" => array("abc" => "110", "def" => "210", "ghi" => "310"), ); と $hoge2 = array( "three" => array("abc" => "120", "def" => "220", "ghi" => "320") "four" => array("abc" => "130", "def" => "230", "ghi" => "330") ); に分割したいと考えています。 どのように記述すればよいのでしょうか?

    • ベストアンサー
    • PHP
  • Excelでのリンク機能関数

    シート1が以下のようにあったとします。 A B 1 No.1 abc 2 No.2 def 3 No.3 ghi 4 No.4 jkl シート2で、A1に「No.1」と記入するとB1に「abc」と表示したいのです。 A B 1 No.1 abc 2 No.2 def 3 No.3 ghi 4 No.4 jkl ↑ ↑ 手動 自動表示 このように出来る関数はありますか? また、使い方のサンプルなどもあればありがたいです。 よろしくお願いします。

  • 組み合わせの計算です

    9人の場合 ABC ADG AEI AFH DEF BEH BFG BDI GHI CFI CDH CEG 16人の場合 ABCD AEIM AFKP AGLN AHJO EFGH BFJN BELO BHKM BGIP IJKL CGKO CHIN CEJP CFLM MNOP DHLP DGJM DFIO DEKN 組み合わせの計算です。 25人の場合に上記のような一度も重複がなく、 綺麗に揃う組み合わせを教えていただければなと思います。 25人まででこれ以外にもありましたらそちらもお願いします。

  • [SQL]重複内容を持つデータから1件抽出かつ複数のカラムを表示したい

    [SQL]重複内容を持つデータから1件抽出かつ複数のカラムを表示したい 初めてお世話になります。 データベース種別はH2です。 参考:http://www.h2database.com/html/main.html 下記のようなテーブルAがあるとします。   ID  |  TAG  | ―――――+―――――|   1   |  abc   |   1   |  def   |   1   |  ghi   |   2   |  abc   |   2   |  ghi   |   3   |  abc   |   3   |  def   |   3   |  ghi   |   4   |  abc   | 上記テーブルAから下記例のような結果を得られるSQLを知りたいのです。   ID  |  TAG  | ―――――+―――――|   1   |  abc   |   2   |  abc   |   3   |  abc   |   4   |  abc   | 上記結果でなくとも、   ID  |  TAG  | ―――――+―――――|   1   |  def   |   2   |  ghi   |   3   |  def   |   4   |  abc   | であっても構いません。(TAG列のデータはどんな内容でもよいです。) 実現させたいのは、 (1)ID列が重複しない結果を表示させたい、 かつ (2)TAG列も表示させたい ということです。 これでイケるだろ!と思ってあえなく失敗したSQLは下記です; select distinct(ID), TAG from A 宜しくお願い致します。

  • 2つのテーブルの連動

    MySQL3を使っています。 [tableA] ID |NUM ------- abc|1 def|2 ghi|3 [tableB] ID |TEXT ------- def|あいうえお abc|かきくけこ def|さしすせそ のような2つのテーブルがあって、[tableB]のデータを[tableA]のNUM列の番号順に、出力するにはどうすればいいのでしょうか? 上の例で行くと、 abc|かきくけこ def|あいうえお def|さしすせそ こんな感じの並びにしたいのです。

    • ベストアンサー
    • MySQL
  • エクセル マクロ 複数のシート間で、セルの組み合わせがマッチしない行を、別シートへ移動する方法教えてください!!

    Sheet1には今月の、Sheet2には先月の顧客NO.、会社名、商品名、金額データがあります。Sheet1にはエリア情報がありますが、Sheet2にはありません。 これらエリア情報を除く4つのセルの内容、全てマッチしている行はそのままで、1つでも違う組み合わせのあるものがあれば、Sheet3ヘ移動したいのですが。。 つまり今月新しく上がってきたもののみを行ごと、別のシートに移動できればと思います。 下記のイメージです。 <Sheet1> 今月分 No. 会社    商品    金額   エリア 123 ABC商事  ペン    ¥500   新宿区    456 DEFコープ ノート   ¥200   渋谷区 789 GHI     DVD    ¥30000  中野区 113 UFP     CD ¥25000  港区 <Sheet2> 先月分 No. 会社    商品    金額 155 XXX    クリップ  ¥4000 456 DEFコープ ノート   ¥200 113 UFP     CD     ¥25000 <Sheet3> 今月NEW分 123 ABC商事  ペン    ¥500   新宿区 789 GHI     DVD    ¥30000  中野区 どなたか分かる方いらっしゃいますか? 教えてください!!

  • VBAで配列のデータを検索

    初歩的なことかもしれませんが、自力ではどうしてもできなかったので質問させてください。 例えば dim 配列(5) as String 配列(0)=abc 配列(1)=123 配列(2)=def 配列(3)=456 配列(4)=ghi 配列(5)=789 といった配列がある場合で、配列()から「ghi」を検索したい場合は、 どのような手法を使えばよろしいでしょうか。

  • DTDの記述

    こんにちは。 DTDの記述方法で悩んでいます。 以下のようなXMLをDTDで規定したいのですが、可能でしょうか。 <Elem></Elem> <Elem>ABC</Elem> <Elem> <Child>ABC</Child> <Child>DEF</Child> <Child>GHI</Child> </Elem> つまり、 <!ELEMENT Elem (#PCDATA)> と、 <!ELEMENT Elem (Child*)> を同時に規定したいのです。 <!ELEMENT Elem (#PCDATA|Child*)> だと、エラーになってしまいました。 また、 <!ELEMENT Elem (#PCDATA|Child)*> では、 <Elem>  ABC <Child>GHI</Child> </Elem> といった場合も有効になってしまいます。このケースは除外したいのです。 こういった場合の記述はどうしたらいいのでしょうか。 あるいはDTDでの記述は無理なのでしょうか。

    • ベストアンサー
    • XML
  • <li>(リスト)で、数字や記号に色を付ける方法

    HTMLタグで リスト(<li>)というのがありますが、 これを使った場合で、文字ではなくその文字列の前に付く リストの記号やリスト番号に色を付ける方法はありませんか。 1.ABC 2.DEF 3.GHI の数字の部分に色を付けたいのですが。 単純には出来ないのでしょうか?

    • ベストアンサー
    • HTML