• 締切済み

再起SQL が無限ループします。

再起SQL が無限ループします。 このようなテーブルのデータがあったときに、 1番上の1レコードを選択して、 中分類か小分類が同じデータを取得したいんです。 大分類 中分類 小分類 -------------------- 4444 |aaaa |0001 4444 |bbbb |0001 4444 |cccc |0002 4444 |dddd |0002 4444 |aaaa |0003 6666 |ffff |0003 ↓このように取得したい 大分類 中分類 小分類 -------------------- 4444 |aaaa |0001 4444 |bbbb |0001 4444 |aaaa |0003 6666 |ffff |0003 再帰SQLのwithを使ってみたのですが、 無限ループしてしまいます。 with rec (大分類,中分類,小分類) as (select * from 商品テーブル where rowid=1 union all select * from 商品テーブル h, rec r where(h.中分類=r.中分類 or h.小分類=r.小分類) and not (h.中分類=r.中分類 and h.小分類=r.小分類) ) select * from rec; union all以下のselect条件をxorで取ればいいと 思うのですが、それができていないようです。 withでやる必要はないので、他の方法でも いいのですが、S/Pは使えない事情があります。 アドバイスをお願いします。

  • Oracle
  • 回答数2
  • ありがとう数11

みんなの回答

  • muyoshid
  • ベストアンサー率72% (230/318)
回答No.2

こんにちわ。 select distinct 大分類,中分類,小分類 from 商品テーブル じゃだめでしょうか?

回答No.1

with a as ( select dai,tyu,syo ,case when tyu = first_value(tyu)over(partition by dai) or syo = first_value(syo)over(partition by dai) then 1 else 0 end as b from syohin ) select dai,tyu,syo from a where b = 1

suraimuman
質問者

補足

o123459876さん、ありがとうございます! 文章の説明が悪かったのですが、 1番上の1レコードを選択して、 中分類か小分類が同じデータを取得し、 さらに取得したレコードと同じ中分類か小分類の レコード取得し…と、中分類か小分類が一致する データがなくなるまで繰り返したいのです。 例のだと、 6666 |ffff |0003 のデータも取得したいのです。 何か方法ありますでしょうか。

関連するQ&A

  • SQL文の書き方

    お世話になっております。 現在、SQLServer2000(SP4)を使用しています。 次の結果を求めるSQL文を作りたいのですが、中々上手く行きません。 良い方法を教えて下さい。 あるテーブル(tableA)にレコードが以下のようにあるとします。 【基本コード】【大分類】【中分類】    1      1    3    1      1    4    1      2    1    2      1    99    2      18    1    3      3    2 やりたい事は、【基本コード】毎に、【大分類】【中分類】の最小値を取得したいので、下記の結果を得たいのですが、 期待する結果↓ 【基本コード】【大分類】【中分類】    1      1    3    2      1    99    3      3    2 現在考えているSQL文では、下記のようになってしまいます。 実際の結果↓ 【基本コード】【大分類】【中分類】    1     1     3    2     1     3    3     3     3 現在考えているSQL文↓ SELECT  基本コード,  MIN(大分類) AS 大分類,  (SELECT MIN(中分類) FROM tableA WHERE 大分類 = (SELECT MIN(大分類) FROM tableA) GROUP BY 大分類) AS 中分類 FROM tableA GROUP BY 基本コード 中分類を求める場合の、大分類の指定の仕方が悪いのはわかるのですが、どう直したら良いのか分からず困っています。 宜しくお願いします。

  • SQLについて何ですが

    一つのSQLで下記の様な検索が出来ないかと考えています、 大分類に分けて大分類の中で売れている商品のTOP10を表示し、 現在表示されている商品を抜いた売れている商品TOP100もに表示できるようとしています、 分類のテーブル・商品がどの分類に当てはまるのか関連づけし注文数も保持しているテーブル・商品の売れ行きを保持しているテーブルがあり 分類テーブルには15個(将来的に増える可能性ある)の分類ワードが入っていて、分類別に売れているTOP10を表示し重複部分もあるので最大150個の商品が表示されるようになっています、 全商品の売れ行きTop「表示されている商品プラス100件」を割り出しその中から表示商品はずしてみようと思いこの様なSQL文と作ったのですが今一うまくいっていないような気がします、 「select 商品名 注文数 from 商品テーブル    where 商品名 not in( select 商品名 from 分類商品テーブル where 分類 in ( select 分類 from 分類テーブル )    order by 注文数 desc limit 10) order by 注文数 desc limit 表示商品数+100」 どうもうまく表示できていない様な気がしているのですが、 このSQLどうなのでしょうか? ほかにもっといいSQL文があれば教えてください。 」

  • WHILEで取り出しループ中にさらにSQL文を入れたいです。

    こんばんは。 いつもお世話になっております。 またはまってしまったみたいで、どうにもわからなく なってしまいました。 どうかご指導よろしくお願いいたします。 使用環境はPHP5+Apche+MySQL4.0です。 2つのテーブルから【一覧リスト】というページを作って mysq_fetch_array関数で、行をループで呼び出しました。 ここまでは出来たのですが、取り出したキー情報を もとに、別テーブルの情報(文字列)を取り出したい のです。 以下、試してみたコードです。 //SQL発行 $rs = mysql_query("select * from uriage", $conn); //1件ずつ取り出すループ while( $rec = mysql_fetch_array( $rs, MYSQL_ASSOC)){ echo "<tr>"; echo "<td>".$rec['oder_no']."</td>"; $sql = "(select*from syouhin where syouhin_id = '".$rec["syouhin_id"]."')"; $res = mysql_query($sql); $rows = mysql_fetch_array($res); echo $rows["syouhin_name"]; echo "<td>".$rec['siiresaki']."</td>"; echo "<td>".$rec['tanka']."</td>"; echo "</tr>"; } Parse error: syntax error, unexpected T_ECHO というエラーが返ってきています。 エラーの行数はecho $rows["syouhin_name"]; の部分です。 何が悪いのかすら判らなくて…。 どうか、ご指導よろしくお願いいたします。

    • ベストアンサー
    • PHP
  • SQL文でエラーが出ます。

    MySQLの事で質問です。 テーブル1~4を結合してフィールド「comment」を検索 する時にフィールド「postDate」の降順でソートしたい のですがエラーが出ました。 「SQLコマンド」 select text from table1 union all select comment from table2 union all select comment from table3 union all select comment from table4 where match(commentIndex) against("検索ワード" in boolean mode) order by postDate desc; 試しに union all select comment from table2 union all select comment from table3 union all select comment from table4 の部分を削除して実行してみた所、成功しました。 後、order by postDate desc;のみ削除した場合でも成功しました。 エラーの内容はこれです↓↓ Unknown column 'postDate' in 'order clause' フィールド「postDate」は存在します。 (varchar型何ですが、それがいけないと思い date型やdatetime型と変えてみましたがダメでした) 何とかソートしたいのですがどうすればいいのでしょうか?

    • ベストアンサー
    • MySQL
  • access で 方法を教えてください。

    access で 方法を教えてください。 テーブルは セミコロン区切りで、区切られて表示されています (テーブル例)  1 aaaa;bbbb;cccc;dddd;eeee;ffff 2000byte 2 aaaa 300byte 3 bbbb;cccc;ffff 3000byte 4 ffff;dddd 120byte このセミコロン区切りの区切られたデータの 「件数」と「バイト」を表で表示させる方法を教えて欲しいのです。 上記テーブル例を使用しての(抽出例)  抽出条件    ↓   aaaa 2件 2500byte   bbbb 2件 5000byte  cccc 2件 5000byte   dddd 2件 2120byte   eeee 1件 2000byte   ffff 3件 5120byte 宜しくお願いします。

  • SQL データ集計

    はじめまして、現在Postgres8.3を利用して開発を行っています。 以下のテーブルがあります。 No  グループ ------------------------------------- 1    AAAA 2    BBBB 3    CCCC ■テーブルB ID  項目CD 評価結果 グループ 登録日 ------------------------------------- A   1-1-1   ○ AAAA 2000-10-10 A   1-1-1   ○ AAAA 2007-12-10 B   1-1-1   × AAAA 2006-12-16 C   1-1-1   ○ AAAA 2009-04-16 A   1-2-1   ○ AAAA 2004-10-16 A   1-2-1   ○ AAAA 2007-01-16 B   1-2-1   ○ AAAA 2003-12-14 C   1-2-1   〇 AAAA 2007-12-15 評価結果は、○と×があり、項目CDごとに集計を行い、項目CDが同じ場合は、○がいつくあっても1とみなして計算するということをおこないたいです。 登録日を指定して、抽出したいのですが、 登録日を 条件に含めると、全部計算されてしまいます。 select count(評価結果) from (select ID,項目CD,評価結果 from テーブルB group by ID,項目CD,評価結果 order by ID,項目CD,評価結果) as rtable where rtable.評価結果 = '○' rtable.登録日  between '2000-01-01' and '2009-01-01' ■理想の結果 グループ 合計  -------------- AAAA   5    ■現在の結果 グループ 合計  -------------- AAAA   7    どうしても出来なくって、困っています。 よろしくお願いいたします!!

  • SELECT分での結果の取り出し方

    以下の様なテーブルから SELECT分で条件をWHERE CODE = '0001' の様に指定して 求まった結果を1つの文字列にしたいのですが 良い方法がありましたら、教えて下さい。 SELECT * from testtbl; CODE NAME ------------------------------- 0001 AAAA 0001 BBBB 0002 CCCC 0003 DDDD この例だと、 SELECT NAME FROM testtbl WHERE CODE = '0001'の様な形で NAMEの部分の結果として,'AAAA,BBBB'の文字列を取得したいです。 ファンクションとかで実現できるでしょうか?

  • 抽出結果にレコードNoを付与することは可能?

    mysql5.0.18です よろしくお願いします 抽出結果にレコードNoを付与したいのです 実際には順位(同点は同順)としたいのですが 複雑になりそうなので 単純に、抽出結果に先頭から連番が振れればOKです 例えば テーブル名:test_table カラム:keys,data,value keys  data  value a001  aaaa  80 a002  aaaa  90 b001  bbbb  100 b002  bbbb  51 上記のテーブル内容から 抽出します Select keys,data,value From test_table Where keys Like '%002' Order By value Desc, data Asc 抽出結果 keys  data  value a002  aaaa  90 b002  bbbb  51 上記抽出結果を keys  data  value  rec_no a002  aaaa  90    1 b002  bbbb  51    2 のように 抽出結果に先頭から連番を振りたいのです このようなことは実現できるのでしょうか? temporaryは使用したくありません (Dropのタイミングがよく分からないので・・・) viewはOKです 理想は・・・ Select keys,data,value,rec_no(auto increment) From test_table Where keys Like '%002' Order By value Desc, data Asc のような事ができないのかな?と妄想していますTT よろしくお願いします

    • ベストアンサー
    • MySQL
  • ループの仕方

    select文で、まずデータが何件あるかカウントしたあと、 そのカウントした数の分だけ、ループしたいです。 ループに入れ込みたいSQLは以下のような感じです。 1.select 1a,1b from TABLE1 where 条件; 2.select 2a,2b from TABLE2 where 条件; カウントした数の受け渡しとかも、分からないような状態なのですが、 初心者向けに教えていただけないでしょうか。 宜しくお願いします。

  • Access Union について

    下記2テーブルがあります。 テーブル1 品番   1月合計 AAAA   1111 BBBB   2222 CCCC   1122 EEEE   3211 テーブル2 品番   2月合計 AAAA   1211 BBBB   3222 CCCC   1522 DDDD   2223 UNIONのSQL文で下記のような結果を得たいです。 品番   1月合計  2月合計 AAAA   1111    1211 BBBB   2222    3222 CCCC   1122    1522 DDDD         2223 EEEE   3211 SQL文をどのように書いたらいいですか。ご教授,お願い致します。