AテーブルとBテーブルから条件を指定してレコードを取得する方法
- 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' 一度上の命令文でテーブルを作って元のテーブルとマッチングさせるしかないのでしょうか?出来れば一発で抜き出したいです。 ご教授宜しくお願いします。
- kotokoto8603
- お礼率100% (1/1)
- Oracle
- 回答数1
- ありがとう数1
- みんなの回答 (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の制約で、行頭に半角のスペースが入れられないので、インデントは全部全角のスペースになっています。カット&ペーストする時には半角のスペースに直すか削除してください。
関連する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) とまでためしに作りましたが、同じレコード同士の比較になってしまうため、比較できません。
- ベストアンサー
- Oracle
- フラグがたっているデータがあったら検索かけたい・・。
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年目の新人なので、どなたかご教授お願いします。
- ベストアンサー
- Oracle
- 一番新しい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してキーが変わったら更新するというやり方が望ましいのでしょうが、レコード数が多く、パフォーマンス的にあまり望ましくありません。 できるだけ作業が簡単な方法だと助かります。
- ベストアンサー
- Oracle
- 重複レコードのある項目を比較し更新する方法
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
- ベストアンサー
- Oracle
- 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です。 よろしくお願いします。
- ベストアンサー
- PostgreSQL
- 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は使わずにお願いします。
- ベストアンサー
- Oracle
- 同じフィールドから複数条件の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、氏名、同一学生内連番、科目 なのでどちらも履修している学生を抽出できませんでした。 どのようにしたらよろしいのでしょうか。よろしくお願いいたします。
- ベストアンサー
- その他(データベース)
お礼
ありがとうございます。 外部結合については思いつきませんでした>< 想定どおりに抽出できました。 注意書きに箇所については次回から改善します。