• ベストアンサー

階層問い合わせで重複レコードの非表示

テーブルに人の名前とその人が属しているグループの名前を持っています。 ある人Aと同じグループに属する人を取得したいです。 SELECT man_name FROM tableA START WITH man_name ='A' CONNECT BY (PRIOR group_name = group_name) and (prior man_name < man_name) 無限ループのエラーを回避する為に、 and (prior man_name < man_name) の条件を入れてますが、同じ人(レコード)が 何回も現れてしまします。 同じレコードの表示を1回だけにするにはどうしたらよいのでしょうか。

  • b13
  • お礼率51% (132/256)
  • Oracle
  • 回答数2
  • ありがとう数2

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

  • ベストアンサー
  • fu_u_ka_i
  • ベストアンサー率51% (15/29)
回答No.2

誤解があるようです。 >このテーブルはレコード数が多く、2回問い合わせするよりは、1回の方がいいかと思い階層問い合わせを使ってみました。 >ですが、階層問い合わせの方がパフォーマンスが落ちるのでしょうか? 階層問い合わせは、(最低でも)階層の階数分、索引およびテーブルを探査します。 なので、サブクエリを使った問い合わせの方が圧倒的に速く終わるはずです。 select man_name from tableA where group_name in (select group_name from tableA where man_name='A');

b13
質問者

お礼

ありがとうございます。 階層問い合わせはFROM句が一つなので、問い合わせが1回かと思っていました。 パフォーマンスを考えたら、階層問い合わせはあまり使わない方がいいみたいですね。

その他の回答 (1)

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

こんにちわ。 階層問い合わせを使う必要は無いと思いますょ。 Select man_name from tableA where group_name = (select group_name from tableA where man_name = 'A') order by man_name; でどうでしょう?

b13
質問者

お礼

回答ありがとうございます。 副問い合わせでも対応できるようですが、 このテーブルはレコード数が多く、2回問い合わせするよりは、1回の方がいいかと思い階層問い合わせを使ってみました。 ですが、階層問い合わせの方がパフォーマンスが落ちるのでしょうか?

関連するQ&A

  • 不要なwhere文が混じった重複レコードのカウント

    下記のSQL文があります。 tableA内で、tableA.id(A.id)は重複があります。 tableA内でのtableA.id(A.id)の重複レコード数をcount関数などでSELECTしたいのですが、 下記SQL文からどのように付け加えたらいいのか、お分かりの方いますでしょうか? SELECT A.id as id, A.xxx as xx, A.yyy as yy, B.zzz as zz FROM tableA A, tableB B WHERE A.id = B.id AND A.xxx = x AND A.yyy = y なお、「A.yyy = y」という条件は、tableA.idの重複レコード数をカウントする上で必要な条件なのですが、 「A.xxx = x」という条件は、tableA.idの重複レコード数をカウントする上で、不要な条件です。 以上、よろしくお願いいたします。

    • ベストアンサー
    • MySQL
  • 重複レコードのある項目を比較し更新する方法

    nameで重複しているレコードをDateの 最新の日のレコードのIDをTGT_IDに入れたいのですが select * from テーブル名 where name in ( select name from テーブル名 group by name having count(*) > 1 ) と重複したカラムを抽出まではできるのですが そこからどうしたらいいのか分かりません どなたかご教授をお願いします。 ID name date tgt_id 1 A 20040403 2 2 A 20040625 2 3 B 20040429 4 4 B 20040623 4

  • 重複するレコードを調べるSQL

    重複するレコードを調べるSQL 初歩的な質問ですみません! 重複するレコードを調べるために以下のようなSQLを作ったのですが、 遅くて困っています。 もっと速くする方法があれば教えてください! 異なるカテゴリーでも商品コードが重複しているものがないかを探すSQLです。 SELECT A.商品コード, A.X, B.カテゴリー FROM (SELECT COUNT(商品コード) X, 商品コード FROM テーブルA WHERE 追加年月 = 201008 GROUP BY 商品コード) A, (SELECT 商品コード, カテゴリー FROM テーブルA WHERE 追加年月 = 201008 ) B " WHERE A.X >= 2 AND B.商品コード = A.商品コード

  • 1つのテーブルから複数のテーブルへのデータ振分け

    MySQLを使用して、tableAというテーブルのデータを tableB,tableC,tableDというテーブルに振り分けたいと思っています。 1日1回、自動的に行いたいと思っています。 たとえば、tableAのテーブル構成が下記のようなもので ================== name sex birth address phone email company ================== name,address,phoneはtableBに name,sex,birthはtableCに name,companyはtableDに分けるというような イメージです。 私の考えでは、下記のようなSQL文をPHPから呼び出して、タスクで 実行させてそれぞれ別のテーブルに振り分けようと思っている のですが、、もっと良いツールや方法があればお教えいただけ ませんでしょうか。 宜しくお願いいたします。 ---------------------------------------------------------------------------------------------------- INSERT INTO tableB (name,address,phone) SELECT tableA.name,tableA.address,tableA.phone FROM tableA AND INSERT INTO tableC (name,sex,birth) SELECT tableA.name,tableA.sex,tableA.birth FROM tableA AND INSERT INTO tableD (name,company) SELECT tableA.name,tableA.company FROM tableA; ----------------------------------------------------------------------------------------------------

  • 副問合せについて

    現在使用しているMySQLではサブクエリーが使えないそうで困っています。 以下の表から、group = 2 に所属している人達の中でもっとも若い人MAX(birthday)の 総ての項目(group name birthday address)を取得したいのですが、 サブクエリーを使わずに取得するには、どの様なSQL文で問い合わせたらいいか教えて頂けないでしょうか、 よろしくお願いします。 group name birthday address 01 Aさん 1971-05-21 東京都 02 Bさん 1981-02-03 神奈川県 01 Cさん 1980-07-26 群馬県 01 Dさん 1976-10-31 埼玉県

  • 複数表からのカウントを教えてください

    <table A> no name 1 yoshida 2 tanaka <table B> no sub score 1 german 100 1 english 100 1 science 50 tableAとtableBの2つの表があり 1 yoshidaさんが100点をとった科目の数を (ここでは2となります) カウントしたいのですが以下の_________で どのように入力したらいいでしょうか 先週から始めたばかりで表の入力はできるよう になったのですがカウントのしかたがよく わかりません よろしくお願いします SELECT tableA.no as No, tableA.name as Name, ___________________ FROM tableA, TableB where(tableA.no = tableB.no and tableB.score = 100 and tableB.no = 1 )

    • ベストアンサー
    • MySQL
  • SQL GROUPで件数の一番多いレコードのみ取る

    SQL GROUPで件数の一番多いレコードのみ取る ORACLE10です。 次のようなテーブルがあります。 USER -----------テーブル名 ID,NAME,DATA----列名 1,A,any 1,A,any 1,B,any 2,C,any 3,D,any このテーブルから、IDをGROUPにして、さらに、一番使用頻度の多いNAMEを取得したいのです。 表示したいのは、IDとNAMEです。 つまり、取得結果例は次のようになります。 取得結果例 ID,NAME----列名 1,A 2,C 3,D SQL文をどのように作れば可能でしょうか? ちなみに、IDやNAMEのマスタテーブルはありません。 自分では、「(select ID, NAME, count(*) from USER group by ID, NAME) COUNT」で、COUNTを内部テーブルにして、グループ内で一番多いcount(*)をmaxで取得してみようかと思ったんですが、そこからアイデアが出ませんでした。

  • 複数表からのカウント(2)教えてください

    前回の質問と関連しますが 今度は複数の人について 以下のような処理を行うときのクエリーでうまくいか ないのですがどのようになおせばいいでしょうか。 よろしくお願いします <table A> n id name 1 1 yoshida 2 2 tanaka <table B> n id sub score 1 1 AAA 100 2 1 BBB 100 3 1 CCC 50 4 2 AAA 80 5 2 BBB 100 6 2 CCC 50 <result> name count yoshida 2 tanaka 1 tableAとtableBの2つの表があり tableAの2人(以上あり)のscoreが100である subの数をカウントしたい場合 SELECT tableA.name as Name, count(*) FROM tableA, TableB where(tableA.id = tableB.id and tableB.score = 100 )

    • ベストアンサー
    • MySQL
  • カウント結果を1レコードの中で横に並べたい

    カウント結果を1レコードの中で横に並べたい 以下のテーブルを、 test_table id   group  name 1    100   テスト1 2    100   テスト1 3    100   テスト1 4    200   テスト1 5    200   テスト1 6    200   テスト2 7    200   テスト2 8    200   テスト2 9    200   テスト2 nameごとのカウント、更に100だけのカウント、200だけのカウントといったように、 以下のように横に並べることは可能でしょうか? name   合計  100計   200計 テスト1  5    3      2 テスト2  4    0      4 まず、nameごとの合計を取得するクエリを作って、 それに、100計列、200計列の部分をサブクエリでもってきたのですが、 これで動くには動くんですが、このやり方しかないものでしょうか。 ご教示おねがいします。 SELECT t.name, COUNT(*) as '合計', (SELECT COUNT(*) FROM test_table as t1 WHERE t1.name = t.name AND t1.group = '100' ) as '100計', (SELECT COUNT(*) FROM test_table as t1 WHERE t1.name = t.name AND t1.group = '200' ) as '200計' FROM test_table as t WHERE 1 GROUP BY t.name;

    • ベストアンサー
    • MySQL
  • 複数レコードのデータを1レコードに集約したい

    お世話になります。 複数レコードのデータを1レコードに集約したいのですが色々試してみましたが上手くいきません。 まず、以下のようなテーブルがあります。 TableA(キーはID) ID NO 1, 2 TableB(キーはIDとNO) ID NO SYU_NO FUKU_NO 1, 1, 1, 1 1, 2, 1, 2 1, 3, 2, 1 2, 1, 1, null    ・    ・ TableC(キーはIDとKUBUNとNO) ID KUBUN(SYU or FUKU) NO START END KAKUNIN 1, 1, 1, 20090101, 20091231, 20090310 1, 1, 2, 20090201, 20091130, 20090310 1, 2, 1, 20090401, 20100331, 20090312    ・    ・ これを、以下のようなレコードにしたいのですが・・。 ID START(SYU_NO) END(FUKU_NO) START(FUKU_NO) END(FUKU_NO) 1, 20090101, 20091231, 20090401, 20100331 以下のようなselect文を作成しましたが・・。 select A.ID || ',' || case when C.KUBUN = 1 then C.START end || ',' || case when C.KUBUN = 1 then C.END end || ',' || case when (C.KUBUN = 2 and B.FUKU_NO = C.NO) then C.START end || ',' || case when (C.KUBUN = 2 and B.FUKU_NO = C.NO) then C.END end || ',' || from TableA A inner join TableB B on A.ID = B.ID and A.NO = B.NO inner join TableC C on B.ID = C.ID and ((C.KUBUN = 1 and B.SYU_NO = C.NO) or (C.KUBUN = 2 and B.FUKU_NO = C.NO)) ; 以下のような結果が返ってきます。 ID START(SYU_NO) END(FUKU_NO) START(FUKU_NO) END(FUKU_NO) 1, 20090101, 20091231, , 1, , , 20090401, 20100331 実は別サイトでも投稿しておりますが回答がなく大変困っております。 どうか宜しくお願い致します。