AテーブルとBテーブルから条件を指定してレコードを取得する方法

このQ&Aのポイント
  • AテーブルとBテーブルから条件を指定してレコードを取得する方法について説明します。
  • 条件としては、Aテーブルは全レコード出力し、BテーブルのAテーブルシーケンス番号が複数存在する場合は登録日が一番古いレコードを抽出し、Bテーブルの処理済みフラグが0のレコード以外はnullとします。
  • 現在の命令文ではAテーブルの0001分しか抽出できないため、一度命令文を実行してテーブルを作成し、元のテーブルとマッチングさせる必要があるかもしれません。一発で抜き出す方法について教えてください。
回答を見る
  • ベストアンサー

条件をつけてレコードを取得したい

以下のようなA,Bテーブルから条件を指定してレコードを取得したい 【Aテーブル】 ID Bテーブル番号 0001      null 0002      null 0003      null 【Bテーブル】 シーケンス番号   ID    登録日 処理済みフラグ       0010  0001 2014/01/01        0       0011  0001 2014/01/02        1       0012  0001 2014/01/03        0 <結果> 【Aテーブル】 ID Bテーブル番号 0001     0001 0002     null 0003     null 条件としては以下の条件です。 (1)Aテーブルは全レコード出力する (2)BテーブルのAテーブルシーケンス番号が複数存在する場合、登録日が一番古いレコードを抽出する (3)Bテーブルの処理済みフラグが0のレコード以外はnullとする。 自分で抽出条件を作成したのですが、Aテーブルの0001分しか上手く抽出出来ませんでした。 SELECT * FROM Aテーブル AT (SELECT シーケンス番号, MIN(登録日) AS 登録日 FROM Bテーブル GROUP BY AテーブルID) BT1, (SELECT * FROM Bテーブル) BT2 WHERE AT.ID = BT1.ID AND BT1.登録日 = BT2.登録日 AND BT1.ID = BT2.ID AND BT2.処理済みフラグ = '0' 一度上の命令文でテーブルを作って元のテーブルとマッチングさせるしかないのでしょうか?出来れば一発で抜き出したいです。 ご教授宜しくお願いします。

  • Oracle
  • 回答数1
  • ありがとう数1

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

  • ベストアンサー
  • mitoneko
  • ベストアンサー率58% (469/798)
回答No.1

 テストしてないですが、このあたりで出来そうに思いますけど。 select at.id, bt.シーケンス番号 from Aテーブル at left outer join       (select bts.シーケンス番号 from Bテーブル bts        where bts.登録日=(select min(bts2.登録日) from Bテーブル bts2                     where bts.シーケンス番号 = bts2.シーケンス番号)        and bts.処理済みフラグ=0) bt     on at.id = bt.シーケンス番号  Aテーブルの列は全て出力することが条件なので、Aテーブルと、条件を適用済みのBテーブルを外部結合する必要があるように思います。  これをAテーブルとBテーブルの外部結合から、条件を適用すると、レコードに不足が出てしまいます。  そのため、Aテーブルに対して、Bテーブルから生成した誘導表を外部結合する形にしています。  【注意】OKWEBの制約で、行頭に半角のスペースが入れられないので、インデントは全部全角のスペースになっています。カット&ペーストする時には半角のスペースに直すか削除してください。

kotokoto8603
質問者

お礼

ありがとうございます。 外部結合については思いつきませんでした>< 想定どおりに抽出できました。 注意書きに箇所については次回から改善します。

関連するQ&A

  • 別レコードと比較条件文

    別レコードと比較条件文 下記のテーブルがあります。 ・番号1から始まり番号が2に採番されると、履歴番号に番号1が入ります。 ・履歴番号はひとつ前の番号を持ちます。 ・Aテーブルのレコード数は100以上あります。 Aテーブル ID 番号 履歴番号 A 1 NULL A 2 1 A 3 2 B 1 NULL B 2 1 B 3 2 結果として出力させたいのは、変更回数です。 ・履歴番号は実際のデータですと10桁の複雑な文字列です。 ほしい出力結果 ID 番号 履歴番号 変更回数 A 1 NULL 0 A 2 1 1 A 3 2 2 B 1 NULL 0 B 2 1 1 B 3 2 2 行いたい条件式とは、 一行目:履歴番号がNULLのときは変更回数0とする。 二行目:履歴番号が他レコードの番号と一致する場合、1を持つ。そのレコードの履歴回数がNULLなら判定終わり。 三行目:履歴番号が他レコードの番号と一致する場合、1を持つ。そのレコードの履歴番号が更に他レコードと一致する場合、2を持つ。そのレコードの履歴回数がNULLなら判定終わり。 このようにして変更回数を設定したいのですが、思いつきませんのでご教示お願いできますでしょうか。 試してみたのは、DECODE(履歴番号,'','0',番号,1) とまでためしに作りましたが、同じレコード同士の比較になってしまうため、比較できません。

  • フラグがたっているデータがあったら検索かけたい・・。

    Aテーブルにグループ番号、ID番号、氏名、ステータスフラグが格納されており、BテーブルにID番号、氏名、電話番号、住所が格納されているとします。検索したい条件は、同じグループの中で、ステータスフラグがたっているレコードが1件でもあれば、ID番号を使って、Bテーブルと結合してグループ番号でGROUP BYしてデータがとりたいのです。例えば、Aテーブルにグループ番号001のグループ番号を持つレコードが5レコードあり、そのうちステータスフラグがたっているレコードが1レコード。002のグループ番号を持つレコードが3レコードあり。ステータスフラグがたってるのが0レコードだとします。結果として、001のグループはステータスフラグがたっているレコードがあるから、検索対象になるが、002はステータスフラグがたっているレコードがないので、検索対象にならないといった具合なんですが・・・。よろしくお願いします。自分で考えたSQLは次のものです。SELECT * FROM A, B WHERE A.ID_NUMBER=B.ID_NUMBER GROUP BY A.GROUP_NUMBER HAVING COUNT(A.STATUS=1)>0 こんな感じです。ただCOUNT関数ではこれではダメみたいで・・・。まだ、1年目の新人なので、どなたかご教授お願いします。

  • 一番新しいdatetime型列があるレコードを取得

    下記条件を満たすSQL文を知りたいのですが、どう書けばよいでしょうか? ■構成 Aテーブル ・「id」カラム ・「created_at」カラム … datetime型 ・「area」カラム Bテーブル ・「a_id」カラム ・「created_at」カラム … datetime型 ■前提 ・Aテーブルの1レコード(「id」カラム)に対して、0~複数のBテーブルレコード(「a_idカラム」)がある ・A.id = B.a_id ■欲しい内容 ・「Aテーブル」「Bテーブル」それぞれのカラム内容全部。※条件あり ▼条件1 Aテーブル「id」カラムに対応したBテーブルの「a_id」が複数ある場合には、該当Aテーブル内容+ Bテーブル「created_at」カラムの値が一番新しいレコードを返す(取得レコード数は常に1) ▼条件2 Aテーブル「id」カラムに対応したBテーブルの「a_id」がなかった場合には、該当Aテーブル内容+ Bテーブル側は何も返さない ▼条件3 ※同名カラムを取得する際には、カラム名先頭にそれぞれa、bを付与(「acreated_at」「bcreated_at」) ・後で、それぞれのテーブルカラムとして利用したいだけなので、それが出来れば形式にこだわりはありません

    • ベストアンサー
    • MySQL
  • MySQLでテーブル一致条件に正規表現は使用可能?

    ・MySQLで一致条件に正規表現を使用することは出来ますか? ・もし出来るとすればどのようにすれば良いでしょうか? ■やりたいこと ・aテーブルのurlカラム内容が「/color/★★」だったら「/color/」以下の★★を抽出して、bテーブルのidと一致したレコードを抽出したい ・aテーブルの★★と、bテーブルのidカラムが一致しているレコードが欲しい ・aテーブルのurlカラムには「/color/58」「/color/26」「/hoge/■■」などが入っています SELECT *     FROM a      LEFT JOIN a.url = b.id     REGEXP '^(/color)'?     where a.★★ = b.id

    • ベストアンサー
    • MySQL
  • SQLServer7.0で、SELECT文で列を抽出する ※Nullと0の条件について

    SQLServer7.0で、SELECT文で列を抽出する際なんですが、 列A 列B --------- 1  Null 2  Null 3  1 ↑のテーブルから、列Aの1、2だけを抽出するSELECT文を SELECT * FROM XXX WHERE 列B <> 1 と作成したのですが、うまく動作しません(汗) データが一件も取れないのです。(列B:tinyint型、Null許容) テーブル内のデータをNull→0にして、同SELECT文で抽出すればうまくいったのですが。。 Nullデータを、<>XX という条件で取得することはできないんですかねえ・・・。 それとも、テーブルの設定か、条件の記述方法がまずいんでしょうか。 どなたか、ご存知あればアドバイスをお願いします。

  • Is NULLを使わず、NULL項目をWhere条件で取得する方法

    ID・名前・カナ・備考の4項目をもつ氏名テーブルがあり、同じ名前・カナのレコードはまとめてしまいたいと考えています。 IDは最小のものを、備考は全レコードをくっつけて一つのレコードにする予定です。 Group Byしてcount(*)>1の名前・カナを抜き出し、抽出した名前・カナでWhereしてMIN(ID)や備考をSELECTしたいのですが、カナ=NULLの場合があり、Group ByまではできてもWhereでSelectすることができません。 nvl(カナ,'999999')=nvl(抽出したカナ,'999999')だとWhereで取得することもできるのですが、カナ='999999'と入力されているとNULLとの区別がつかなくなります。 Is NULLを使わず、NULL項目をWhere条件で取得する方法をご存知の方、教えてください。よろしくお願いします。 サンプルとして単純なテーブルを例にあげましたが、実際は数十の列項目をもつ数十のテーブルです。列項目の中には4000バイトのものもあります。 完璧にやるのならGroup Byせず、全レコードをOrder Byしてキーが変わったら更新するというやり方が望ましいのでしょうが、レコード数が多く、パフォーマンス的にあまり望ましくありません。 できるだけ作業が簡単な方法だと助かります。

  • 重複レコードのある項目を比較し更新する方法

    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

  • 2つの条件を満たすのレコードのカラムを抽出する方法について

    下記のテーブルがあったとします。 【t_tblテーブル】 ――――――――――――― |id1  |id2 |id3  | ――――――――――――― |1   |1  |10   | |1   |2  |12   | |1   |3  |9   | |1   |4  |8   | |1   |5  |14   | |2   |1  |14   | |2   |2  |8   | |2   |3  |9   | |2   |4  |12   | |2   |5  |10   | |3   |1  |4   | |3   |2  |2   | |3   |3  |3   | |3   |4  |5   | |3   |5  |6   | |4   |1  |6   | |4   |2  |5   | |4   |3  |3   | |4   |4  |2   | |4   |5  |4   | ――――――――――――― このテーブルの特定のレコードを抽出する為に、 2つパラメータを渡すとします。 1. 12 2. 8 そして下記の条件を満たすレコードのid1を抽出したいと思います。 1. 「id3」 = 「12」 かつ 「id3」 = 「8」 を満たすid1 (※この時点で1と2がヒットします) 2. 条件1を満たした上で、「12」のid2 < 「8」のid2 (※この時点で1のみヒットします) 下記のSQLで条件1を満たせる事は確認しましたが、 条件2を満たす方法が分かりませんでしたので、 アドバイスいただける方がいらっしゃいましたら、 ご教示いただきたいと思います。 select id1 from t_tbl group by id1 Having SUM(CASE WHEN id3=12 Then 1 Else 0 End)>0 And SUM(CASE WHEN id3=8 Then 1 Else 0 End)>0 使用バージョンは7.4.19です。 よろしくお願いします。

  • SQLの結合条件について

    SQLの結合条件について ・table_A ID | ATAI 01 | AAA 01 | XXX 02 | ABC 03 | DEF table_B ID | ATAI 01 | 不要 02 | 必要 03 | 必要 04 | 不要 上記のようなテーブルAとBがあるとします。 やりたいこと 1.テーブルAに存在するIDをBのIDから抽出 2.テーブルAの「ATAI」の値が’AAA’のIDは抽出対象から外す。 ※テーブルAの01IDに’AAA’と’XXX’がありますが、Bの抽出対象から外したい。 2.がうまくいきません。 select B.ID from table_A A,table_B B where A.ID = B.ID 上記のSQLに2.の条件を足して、結果を02と03にしたいです。 ※CASEは使わずにお願いします。

  • 同じフィールドから複数条件のAND条件で抽出する方法

    お世話になります。 同じフィールドから複数条件のAND条件で抽出する方法 DBはAccessです。 フィールド1がA フィールド2がBという条件でしたら Select 抽出フィールド form テーブル where フィールド1=A and フィールド2=B で行っています。 フィールド1がAまたはBでしたら Select 抽出フィールド form テーブル where フィールド1=A or フィールド1=B で行っています。 それではフィールド1がAもBも満たす抽出はどのようにしたら良いのでしょうか。 例: 学生テーブル  フィールド 学生ID、氏名 履修科目テーブル  フィールド 学生ID、同一学生内連番、科目 というテーブル構成で英語、国語のどちらも履修している学生を抽出する場合などです。 2テーブルをリンクしたクエリを作ったのですが、 単にフィールド 学生ID、氏名、同一学生内連番、科目 なのでどちらも履修している学生を抽出できませんでした。 どのようにしたらよろしいのでしょうか。よろしくお願いいたします。