- ベストアンサー
フラグがたっているデータがあったら検索かけたい・・。
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年目の新人なので、どなたかご教授お願いします。
- satosai
- お礼率7% (24/304)
- Oracle
- 回答数4
- ありがとう数0
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
コピペするのに、1行とんだ.. こちらが正しいSQL。 select * from A,B where A.グループ番号 in (select distinct グループ番号 from A where ステータスフラグ=1) and A.ID番号=B.ID番号
その他の回答 (3)
- fu_u_ka_i
- ベストアンサー率51% (15/29)
索引の有無やデータ量等によっては、優劣が出てくるかと思いますが.. 相関サブクエリ(EXISTS条件)やメンバーシップ検査(IN条件)、 インラインサブクエリとの結合など、複数の解決方法があり、 何の前提もおかず考えると、好き嫌い程度の違いでしかないと 思います。 とはいうものの... #3 HAVINGを使うのであれば、 SELECT A.*,B.* FROM A, B, ( select グループ番号 from A where ステータス=1 /* ここ */ group by グループ番号 having count(*) > 0 /* ここ */ ) C WHERE C.グループ番号=A.グループ番号 AND A.ID番号=B.ID番号 ; のように、where句を省略しては、いけません。 where句で対象を絞れるにもかかわらず、そうしないのは 実行効率の観点で×です。
- raphel_7
- ベストアンサー率34% (86/252)
どうしても GROUP BY が使いたいのであれば・・・。 SELECT * FROM A A, B B, (SELECT グループ番号 FROM A GROUP BY グループ番号 HAVING COUNT(ステータス) > 0 ) C WHERE C.グループ番号 = A.グループ番号 AND A.ID番号 = B.ID番号 こんな感じでもできますよ
- k_o_r_o_c_h_a_n
- ベストアンサー率55% (526/942)
次のようなSQLで良いかと思います。 select * where A.グループ番号 in (select distinct グループ番号 from A where ステータスフラグ=1) and A.ID番号=B.ID番号
関連するQ&A
- Access2010でテーブルの内容で検索
現在Accessの勉強をしています。 Aテーブル、Bテーブルとあり、 AテーブルはID(オートナンバー)、番号(数字)、名前(文字列)が入っています。 この番号は重複ありで、複数レコードあるとします。 Bテーブルも同じようなID、番号、名前が入っていて、ここの番号は重複していません。 いわばマスタテーブルのようなものです。 (IDと番号を別ける必要があるのかなど、細かいことはこの際気にしないでください。) Aテーブルの全てのレコードの番号を検索し、Bテーブルにない情報だけを表示したいと思います。 この場合どのようにすればよいでしょうか? まだAccessを勉強したてで、よくわかっていないのですが、シンプルな方法はどのようにすれば良いのか思案中です。 よろしくお願いします。
- ベストアンサー
- Visual Basic
- 条件をつけてレコードを取得したい
以下のような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
- 特定の列だけをGROUP BYしたい時
いつもお世話になっております。 ID列をGROUP BYしてCOUNTしたいのですが 氏名列に入っている値がバラバラなので GROUP BYで思う様に出来ない状態です。 条件から氏名列を外すと当然無効と言われます、 どのように回避すればうまく行くのでしょうか? SELECT 氏名列,ID列,COUNT(カウント列) FROM テーブルA WHERE ID列 IN (1,2,3) GROUP BY ID列,氏名列
- ベストアンサー
- SQL Server
- 別テーブルの検索した結果が0件のデータのレコードを削除したい
SQL Server 2005 を使用しています。 別テーブルで検索した結果が0件の時、対応するレコードを削除したいのですが、SQLをどうかけば実現出来るかわかりません。 具体的には、テーブル Aとテーブル B があって、テーブル Aのキーが AA,AB,ACとします。 この時、テーブル Bにも AA,AB,ACという列があるとします。 この時に、テーブルBをAA,AB,ACでGROUP BYしてCOUNTをとった時にレコード数が0のキーのレコードを、テーブルAから削除したいのですが、この時SQLを一つで書きたいのです。 テーブル Aが明細、テーブル Bが名簿みたいな形で、名簿に存在しないレコードを削除するような感じです。 どういうSQLを書けばいいか少し悩んでいます。 AA,AB,ACは全て integer型です。 どなたかわかりましたら教えてください。
- ベストアンサー
- SQL Server
- Mysql サブクエリの使い方
table_A ---+------ id | count ---+------ 1 | 5 ---+------ 2 | 6 ---+------ 3 | 7 ---+------ table_B ---+----- id | sub_count ---+----- 1 | 2 ---+------ 2 | 2 ---+------ 3 | 5 ---+------ 1 | 3 ---+------ 2 | 4 ---+------ このようなテーブルで table_Aのcountと、table_Bのidでまとめたsub_countの合計が 一致しないidだけを抽出するために、 SELECT table_A.id FROM (SELECT sum(table_B.sub_count) FROM table_B GROUP BY table_B.id) AS B, table_A, table_B WHERE table_A.id = table_B.id AND table_A.count != sum(table_B.sub_cout) と書いてみましたが、うまくいきません。 ERROR 1111 (HY000): Invalid use of group function 何が悪いのでしょうか? mysqlも投稿も初心者です。 よろしくお願いします。
- ベストアンサー
- 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
- ベストアンサー
- Oracle
- 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で取得してみようかと思ったんですが、そこからアイデアが出ませんでした。
- ベストアンサー
- Oracle
- データ処理に関する質問(Access VBAーDAO)
AccessVBA初心者です。いつもお世話なっております。 環境 OSーXPsp2 office2003 テーブル1とテーブル2あって、テーブル1にデータはいってます。テーブル2は空です。 ACCESS VBA DAOで テーブル1のデータの[店名]、[氏名]を テーブル2に横に追加していきたいです。 テーブル2 構造 ID(オートナンバー) [店名]1 [氏名]1 [店名]2 [氏名]2 --------------------------------------------------------- テーブル1のデータ ID(オートナンバー) [店名] [氏名] 1 A Aさん 2 B Bさん 3 C Cさん 4 D Dさん ----------------------------------------------------- 結果 テーブル2 ID(オートナンバー) [店名]1 [氏名]1 [店名]2 [氏名]2 1 A Aさん B Bさん 2 C Cさん D Dさん ACCESS VBAでの書く方 教えてください。宜しくお願い足します。
- ベストアンサー
- オフィス系ソフト
- 【MySQL5.7】IDごとの最頻値
お世話になります。MySQLでidごとの最頻値を抽出しているのですが、 select id, hantei,count(*) as ModeCount from member a group by id,hantei having count(*) >= all(select count(*) from member b where b.id=a.id group by hantei asc) order by id,hantei レコード数は5000件ほどなのですが現在の方法では10.485sと時間がかかりすぎて困っています。MySQLでは最頻値を出すのにサブクエリを使うしかないのでしょうか? こうすればもっと速くなるよって方法があれば教えてください。お願いします。
- ベストアンサー
- MySQL
- COUNT関数が上手く設定できない
COUNT関数が上手く設定できなくて困っています。 DBに案件テーブルと担当者テーブルを設定し、案件に紐付く担当者を検索できるようにしようと思っています。 案件に対して複数の担当者が担当になることがあり、案件テーブルに担当者テーブルをLeft Joinして、最後にGroup byでグルーピングすることによって案件自体は検索できるのですが、ページネーションのためCOUNT関数を使って案件数を求めようとすると、正しい数値が得られません。 select count(a.id) counts // ここをa.* とすることで案件情報を検索することはできます。 from ANKEN a left join TANTOU t on a.id = t.id where flag = 0 group by a.id 正しい件数を取得するにはどのようにすれば良いでしょうか?
- ベストアンサー
- MySQL