- ベストアンサー
SQLでどうやったらできますか?
データベース初学者です。どうぞお知恵をお貸しください。 数百人ほどの名前がnameA列に並んでいるtableAと,数万人の名前がnameB列に並んでいるtableBがあります。tableA列の各行の名前が,テーブルBの中に何回出てくるか数えて,結果の数字をtableAの各行2列目(列名はnumber)に表示させたいと思っています。 SQLは初めて触るので,正直言って方法がまったく見当つきません。。どなたかお詳しい方,どうか宜しくご教示ください。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
dbmsが何だか分からないから、一概に言えないけれど select tableA.nameA, count(*) as "number" from tableA join tableB on tableA.nameA=tableB.nameB group by tableA.nameA ・numerが予約語で使えない場合がある。 ・計算結果に別名をつけるときにasが必須だったり、逆にあるとエラーになったり ・同じく別名をつける時、ダブルクォーテーションでくくるのが雄幸だったり、エラーになったり、(ACCESSやSQL Serverは既定値では[]でくくる)。 ・joinはinnerがないとエラーになる場合あり。
その他の回答 (2)
- yamada_g
- ベストアンサー率68% (258/374)
No.1です。 nora1962さんの回答を拝見して自分の回答の間違いに気づきました。 >where tableA.nameA = tableB.nameB は on tableA.nameA=tableB.nameB です。すみません。
お礼
なんとかうまくできそうです。どうもありがとうございました。
- yamada_g
- ベストアンサー率68% (258/374)
tableAとtableBを結合し、count関数使って件数を取得します。 select nameA ,count(*) as "number" --as で列別名を付けます。numberというのは予約語だったりするので""でくくる必要があるかもしれません from tableA --tableBにtableAの各nameAが必ず1件は存在するのなら、inner join でいいです --outer join との違いはご自身で調べてみてください left outer join tableB where tableA.nameA = tableB.nameB group by nameA; データベースについて質問する際は、対象のデータベース製品名とバージョンを記載したほうがいいです。 (Oracle11g や SQL Server 2008 R2 など) データベース製品やバージョンによって、使える関数だったり記述方法が違うこともありますので。
お礼
お礼が遅れてしまい申し訳ありません。 DBMSはMySQL5.2を使っています。 大変参考になりました。ありがとうございました。
お礼
簡潔に回答頂いてありがとうございます。大変参考になりました。 SQLはDBMSによってかなり方言があるんですね。細かく教えて頂いたのでうまくいきました。 本当にどうもありがとうございます。