SQLの書き方について教えてください
- SQL Serverを使用している際に、テーブルの結合と更新についてわからない箇所があります。詳しい方に教えていただけると助かります。
- 具体的な問題として、テーブル1とテーブル2を特定のキーで結合し、結果をテーブル3に更新したいと考えています。ただし、テーブル2からは先頭の1レコードのみ取り出したいです。
- テーブル3にはテーブル2で取得したid_1とid_2とid_3を書き込みたいです。具体的な条件やテーブルのデータについても記載しています。
- ベストアンサー
SQLの書き方
はじめまして SQL Serverを使用していますが、下記のSQLの書き方がわかりません。 申し訳けありませんが、わかる方がいらっしゃいましたら、どなたか教えて下さい。 ◆質問 テーブル1とテーブル2の下記のKEYで結合させて、取り出した結果でテーブル3を更新したいです。 テーブル2はデータが複数件一致してしまうため、無条件に先頭の1レコードだけを取り出したいです。 取得できたテーブル2のid_1とid_2とid_3をテーブル3に書き出したいです。 ○KEY テーブル1.test = テーブル2.test and テーブル1.test1 = テーブル2.test1 テーブル1.id_2 = テーブル3.id_1 and テーブル1.id_3 = テーブル3.id_2 ○テーブル1 id_1 id_2 id_3 test test1 bbb 000001 001 000001 100 bbb 000002 001 000002 100 ○テーブル2 id_1 id_2 id_3 test test1 aaa 1 99 000001 100 ← このレコードを取り出したい aaa 2 99 000001 100 aaa 3 99 000003 100 aaa 4 99 000004 110 ○テーブル3 id_1 id_2 id_3 000001 001 aaa-1-99 ←id_3にテーブル2で取得できたid1 + id2 + id3を書き出したい 000002 001 夜遅くにすみませんがお願いします。
- runarena2
- お礼率100% (1/1)
- SQL Server
- 回答数1
- ありがとう数1
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
UPDATE TABLE3 SET id_3=tx.id_3 FROM TABLE3 t3 INNER JOIN (SELECT t1.id_2 id_1,t1.id_3 id_2, (SELECT TOP 1 id_1+'-'+CONVERT(varchar,id_2)+'-'+CONVERT(varchar,id_3) FROM TABLE2 WHERE TEST=t1.TEST AND TEST1=t1.TEST1 ORDER BY id_1,id_2,id_3) id_3 FROM TABLE1 t1) tx ON tx.id_1=t3.id_1 AND tx.id_2=t3.id_2 WHERE tx.id_3 IS NOT NULL なお、SQL Server 2005であればROW_NUMBERも使えます。 いずれにせよ、必要なものを順番に組み立てることが肝要です。 UPDATE TABLE3 SET id_3=tx.id_3 FROM TABLE3 t3 INNER JOIN (SELECT t1.id_2 id_1, t1.id_3 id_2, t2.id_1+'-'+CONVERT(varchar,t2.id_2)+'-'+CONVERT(varchar,t2.id_3) id_3 FROM TABLE1 t1 INNER JOIN (SELECT ROW_NUMBER() OVER (PARTITION BY TEST,TEST1 ORDER BY id_1,id_2,id_3) SEQ, * FROM TABLE2) t2 ON t1.TEST=t2.TEST AND t1.TEST1=t2.TEST1 WHERE t2.SEQ=1) tx ON tx.id_1=t3.id_1 AND tx.id_2=t3.id_2
関連するQ&A
- SQLについて教えてください
お世話になります。 SQLについて教えてください AテーブルとBテーブルからCテーブルを作成したいのですが、 KEYをキーにAテーブルのIDが1で、YYMMが一番新しい項目(最大の項目)を 取得し、Cテーブル作成したいのですが、どのようにするのでしょうか? Aテーブル Bテーブル Cテーブル KEY ID yymm KEY KEY YYMM AAA 0 200612 AAA AAA 200611 AAA 1 200611 BBB BBB 200611 AAA 1 200609 BBB 0 200611 CCC 1 200611
- ベストアンサー
- SQL Server
- 分岐SQLを一発のSQLで実現したい
【データベース:SQLServer2005】 SQLのアドバイスを頂きたいです。 【テーブル】 テーブル名:Table1 フィールド名:種類、キー1、キー2 テーブル名:Table2 フィールド名:種類、キー1、キー2 テーブル名:Table3 フィールド名:種類、キー1、キー2 【データ】 Table1 種類、キー1、キー2 001 AAA BBB 001 AAA CCC 001 AAA DDD Table2 種類、キー1、キー2 002 AAA BBB 002 AAA CCC NULL AAA DDD Table3 種類、キー1、キー2 NULL AAA BBB NULL AAA CCC NULL AAA DDD これをUNIONで取得します。 種類、キー1、キー2 001 AAA BBB 001 AAA CCC 001 AAA DDD 002 AAA BBB 002 AAA CCC NULL AAA DDD NULL AAA BBB NULL AAA CCC 実現したいのは、 1)同種類、キー1、キー2のデータで、 種類にNULLが含まれていたら、NULLのデータは取得しない 2)同種類、キー1、キー2のデータで、 種類にNULLしかないデータは、取得する 001 AAA BBB 001 AAA CCC 001 AAA DDD 002 AAA BBB 002 AAA CCC NULL AAA DDD →いる NULL AAA BBB →いらない NULL AAA CCC →いらない ↓結果 001 AAA CCC 001 AAA DDD 002 AAA BBB 002 AAA CCC NULL AAA DDD 上記を実現する為、UNION後のSQLでも構わないので、 一発のSQLで取得する事は可能でしょうか? 有識者の方にご享受頂ければ幸いです。 どうぞ宜しくお願い申し上げます。
- ベストアンサー
- SQL Server
- データ取得
name*****key1****key2****date ------------------------------- AAA*******1*******1*****2003/01 BBB*******2*******2*****2002/12 AAA*******1*******2*****2003/01 BBB*******1*******2*****2002/11 BBB*******2*******2*****2002/11 AAA*******2*******2*****2003/01 AAA*******2*******2*****2002/12 ------------------------------- (※全てのフィールドが同じ情報のレコードはない) ****は意味はありません。表を見やすくするために書いただけです。 上記のテーブルから下記のデータを取得したいと 考えています。 AAA*****2002/12*****1 AAA*****2003/01*****3 BBB*****2002/11*****2 BBB*****2002/12*****1 name列とdate列の重複しないレコードの件数を取得したいのですが どのようなSQLを記述すればよろしいでしょうか?
- ベストアンサー
- その他(データベース)
- SQLの勉強を始めたばかりの初心者です。
SQLの勉強を始めたばかりの初心者です。 2つのテーブルを結合し、以下のような結果を求めるSQL文はどう記述したら良いのでしょうか? アドバイス頂きたく、よろしくお願い致します。 【テーブル1】 ID Data Name ------------------------------------------------ 1 AAA あいう 5 BBB かきく 7 CCC さしす 8 DDD たちつ ------------------------------------------------- 【テーブル2】 ID Information Index -------------------------------------------------- 5 Error 100 8 Check 200 15 Warnning 300 20 Non 0 -------------------------------------------------- 【取得したい結果】 ID Data Name Information Index ------------------------------------------------- 1 AAA あいう 5 BBB かきく Error 100 7 CCC さしす 8 DDD たちつ Check 200 15 Warnning 300 20 Non 0 ------------------------------------------------- つたない説明で申し訳ありません… なお使用しているのはSQL Server 2008です。
- 締切済み
- SQL Server
- SQLの参考書(文法書?)
みなさんこんにちは。 SQLの参考書について、教えてください。 下記のテーブル t0、t1、t2 において、 key0 および key1は t1.id への外部キーで、 key は t0.id への外部キーです。 この構成に対して全リストを SELECT しますと、 RESULT に示す結果となります。 上記のような機能の SQL につきましては、 3個以上のテーブルの結合や、 1つのレコードからの同一テーブルへの複数の結合が必要となり、 記述が複雑になると思います。 そこで教えていただきたいのですが、 このような SQL を記述する際に必要な文法を勉強するには、 どのような参考書が良いでしょうか? どうぞ、よろしくお願いいたします。 TABLE: t2 -------------------- id key0 key1 -------------------- 0 2 0 1 3 1 2 4 6 3 5 7 TABLE: t1 -------------------- id key -------------------- 0 3 1 4 2 5 3 6 4 7 5 0 6 1 7 2 TABLE: t0 -------------------- id text -------------------- 0 "00000" 1 "00001" 2 "00002" 3 "00003" 4 "00004" 5 "00005" 6 "00006" 7 "00007" RESULT: -------------------- id text text -------------------- 0 "00005" "00003" 1 "00006" "00004" 2 "00007" "00001" 3 "00000" "00002"
- 締切済み
- その他(データベース)
- PL/SQLでの集計とテーブルの結合の仕方
いつもお世話になっております。 pl/sqlでの処理なのですが、タイトルのとおり テーブルの結合と集計で分からないところがあり、 こちらで質問させていただきました。 処理内容は あるグループでレコードを集計し、 そのグループが重複する他のテーブルと結合したいと 考えております。 【テーブル1】 (班) (回数) (秒) aaa| 10| 100 aaa| 20| 200 bbb| 10| 150 bbb| 20| 100 ccc| 10| 100 ccc| 30| 250 : : : まずこれを集計し、件数を追加して (班) (回数) (秒) (件) aaa| 30| 300| 2 bbb| 30| 250| 2 ccc| 40| 350| 2 : : : : というようにまとめ、 【テーブル2】 (年月) (班) (円) 200904| aaa| 1000 200905| bbb| 1500 200904| ccc| 2000 : : : というテーブルと結合して (年月) (班) (回数) (秒) (円×件) 200904| aaa| 30| 300| 2000 200905| bbb| 30| 250| 3000 200904| ccc| 40| 350| 4000 : : : : : という形にしたいのですが可能でしょうか? 例に挙げたのは3件しかありませんが テストデータは1万件以上ありそれを処理します。 初心者なので、テーブルの結合の仕方、 集計の仕方が分からず行き詰っております。 どなたか、お力を貸していただけないでしょうか。 よろしくお願いいたします。
- ベストアンサー
- Oracle
- SQLで他のテーブルに無いIDの抽出
MySQLを使っています。 下記は、 1.テーブルaaaには、存在するidのものが、 2.テーブルbbbには、存在しない、 3.テーブルaaaのレコードを抽出したいものです。 "SELECT DISTINCT aaa.*" + " FROM aaa" + " WHERE (aaa.flag = false)" + " AND NOT EXISTS (SELECT * FROM bbb" + " WHERE (aaa.id = bbb.id) AND (bbb.flag = false))" ですが、実行すると、下記エラーがでます。 SQLException:Base table or view not found, message from server: \"Unknown table 'bbb' in where clause" どうすればよいのでしょうか?
- ベストアンサー
- MySQL
- オラクルSQLの累計値取得方法について
教えてください。 3日ほど、悩んでおります。 オラクルのSQLにおいての累計値の取得がどうしてもできません。 会社毎に、毎日の売上累計をSQL一発で取得したいです。 下記例の【★売上累計金額(会社別)】の箇所をレコード毎につみあげて取りたいのですが・・ ただ、対象期間が6ヶ月(約180日)あるので、レスポンスが重要視されています。 なにか、いい方法があれば教えていただきたいです。 例:売上明細テーブル 会社名 売上日 売上金額 ★売上累計金額(会社別) (1)AAA 2005/12/01 1000 1000 (2)AAA 2005/12/02 200 1200 (3)AAA 2005/12/04 300 1500 (4)AAA 2005/12/10 500 2000 (5)AAA 2005/12/03 100 2100 (6)BBB 2005/12/05 300 300 (7)BBB 2005/12/09 200 500 (8)BBB 2005/12/20 100 600 (9)BBB 2005/12/25 1200 1800 (10)CCC 2005/12/05 500 500 (11)CCC 2005/12/08 1000 1500 以上、なんとかご教授お願いいたします!
- ベストアンサー
- Oracle
- SQLについて
SQLについてわからないのでご教授ください。 TABLE AAA コード 適用開始日 適用終了日 ------ ----------- ----------- aaa 20100101 99999999 bbb 20100101 20100531 bbb 20100601 99999999 ccc 20100101 20110711 ccc 20110712 99999999 TABLE BBB コード 適用開始日 適用終了日 ------ ----------- ----------- aaa 20100101 99999999 bbb 20100101 20100531 ccc 20100101 20110711 ・テーブルBBBの適用終了日が'99999999'のコードは テーブルAAAでは適用終了日が'99999999'の1レコードのみ。 ・テーブルBBBの適用終了日が'20100531'などの'99999999'以外は テーブルAAAでは適用終了日が'20100531'のレコードと、翌日'20100601'が適用開始日に設定され '99999999'が適用終了日に設定されたレコードの2レコードが存在。 上記2つが正常の状態です。 これらの条件に反する異常を検知するようなSQLを作りたいです。 たとえば、テーブルAAAのレコード[bbb 20100601 99999999]がない場合、 実行結果としてコード「bbb」が出力されるようなSQLが欲しいです。 異常がなければ、「なにも選択されませんでした。」でよいです。 条件として、 ・テーブルAAAでは「コード」「適用開始日」がPK ・テーブルAAAでは同じコードの「適用開始日」「適用終了日」の期間がかぶることはない ・テーブルAAAでは同じコードで3レコード以上は存在しない (たとえば20100101~20100531、20100601~20100931、20101001~20101231の3つの期間は存在しない) 実行結果はあくまで私の考えで、 異常を検知できればどのような形でも大丈夫です。 なにかあれば補足します。 どうぞよろしくお願い致します。
- 締切済み
- Oracle
- SQLについて
レコード1 |レコード2 |レコード3 AAA |1111 |0000 BBB |1111 |0000 CCC |2222 |2222 CCC |3333 |2222 CCC |4444 |2222 上記のようなテーブルがあった場合、レコード1のAAAとBBBは値をそのまま抽出し レコード1のDDDはレコード2とレコード3の値が一致しているものを抽出したいのですが ひとつのSQLで実現することは可能でしょうか? レコード2とレコード3の値が一致しているものを抽出だけなら簡単にできそうなのですが AAAとBBBもというところで悩んでます。どうかご教授ください。
- 締切済み
- MySQL
お礼
jamshid6 様 ご回答ありがとうございました。 本当に感謝します。 早速今日やってみたいと思います。 本当に助かりました。 これからもっと勉強していきたいと思います。 ありがとうございました。
補足
jamshid6 様 こんばんは 今日さっそく試してみました。 期待通りの結果が出力されました。 まだまだ、追うのが精一杯ですが、必要なものが順番に組み立てられるように訓練します。 本当にありがとうございました。