• ベストアンサー
  • 困ってます

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 夜遅くにすみませんがお願いします。

共感・応援の気持ちを伝えよう!

  • 回答数1
  • 閲覧数124
  • ありがとう数1

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

  • ベストアンサー
  • 回答No.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

共感・感謝の気持ちを伝えよう!

質問者からのお礼

jamshid6 様 ご回答ありがとうございました。 本当に感謝します。 早速今日やってみたいと思います。 本当に助かりました。 これからもっと勉強していきたいと思います。 ありがとうございました。

質問者からの補足

jamshid6 様 こんばんは 今日さっそく試してみました。 期待通りの結果が出力されました。 まだまだ、追うのが精一杯ですが、必要なものが順番に組み立てられるように訓練します。 本当にありがとうございました。

関連する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

  • データ取得

    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を記述すればよろしいでしょうか?

  • Oracl[10g]の SQL文について(No.6)

    何度も恐縮です。前回の質問(例題)が間違えていました。 本当に申し訳ございません。改めて、お願いしたい次第です。 Oracl[10g]の SQL文について、教えて下さい。 [C1]テーブルに [CODE](key) と [NAME]フィールドがあるとします。 内容は、 A-1 NAME-1 A-2 NAME-2 A-3 NAME-3 と、します。 [B]テーブルに [CODE](key) と [NOUKI](key) と [KIN] フィールドがあるとします。 内容は、 A-1 2005/01/01 100 A-1 2005/01/02 200 A-2 2005/01/01 300 A-2 2005/01/10 400 A-2 2005/12/10 500 と、します。 [C2]テーブルに [CODE2](key) と [NAME2] と [CODE] フィールドがあるとします。 内容は、 AAA NAME2-1 A-1 BBB NAME2-2 A-2 CCC NAME2-3 A-3 と、します。 [C3]テーブルに [CODE2](key) と [NO](key) と [KIN2] フィールドがあるとします。 内容は、 AAA 1 200 AAA 2 300 BBB 1 10 BBB 2 20 BBB 3 30 と、します。 結果が、 A-1 NAME-1 300[B]テーブルの合計 500[C3]テーブルの合計 A-2 NAME-2 1200[B]テーブルの合計 60[C3]テーブルの合計 と、なる様にする為には、どういうSQL文を書けば良いのでしょうか ? 前回、教えて頂いた例を参考に頑張っているのですが、 まだ、私には難しすぎる様です。 よろしくお願い致します。

  • すっきりとしたSQL文にしたいのですが

    Oracle9iにてテーブルのデータを更新しようと思っています。 目的としてはAAAのカラムa1とBBBのカラムb1が同一なレコードである場合、 AAAのa2にBBBのb2を更新したいのですが、 <条件> AAA:テーブル1 BBB:テーブル2 a1:CHAR b1:CHAR a2:VERCHAR b2:VERCHAR すべて必須で桁数は10 UPDATE AAA SET AAA.a2 = ( SELECT BBB.b2 FROM BBB WHERE AAA.a1 = BBB.b1) WHERE AAA.a1 = ( SELECT BBB.b1 FROM BBB WHERE AAA.a1 = BBB.b1) ; いまはこんな無駄の多そうなSQLしか分かりません。 この他にも条件が2つ追加される予定なので もっとすっきり更新できる方法を教えていただけませんでしょうか? よろしくお願いします。

  • 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について

    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つの期間は存在しない) 実行結果はあくまで私の考えで、 異常を検知できればどのような形でも大丈夫です。 なにかあれば補足します。 どうぞよろしくお願い致します。

  • オラクルSQL文のCOUNT関数について

    SELECT COUNT (*) AS XXXX FROM AAA,BBB WHERE AAA.AAA = BBB.BBB AND ・・・・ ・・・・ やりたい事は、AAAテーブルだけのカウントをしたいのですが 現状、BBBのカウントもしてしまいます。 BBBはWHEREでAAAに対して比較だけを 行いたいのですが、この場合どうやったらいいのでしょうか。

  • 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もというところで悩んでます。どうかご教授ください。

  • SQLについて

    お世話になっております 以下の内容、お分かりになる方ご教授お願い致します Win2000 Access2000 TESTテーブル Key1  Key2  Key3 100  5     1 100  5     2 100  5     3      ←X 100  10     4      ←X2 110  10     2      ←X3 各項目は全て数値型です 上記データ内容のときにKey1が100以上でKey2が5以上で Key3が3以上のデータを取得したいと思っております 結果としてXからX3までのデータを抽出したいのですが どの様に行えばよろしいでしょか? SELECT * FROM TESTテーブル WHERE Key1 >= 100 AND Key2 >= 5 AND Key3 >= 3 の様に組むとKey1が110の項目は取得できなくなります Key3 >= 3の様に組んでるのでだとは思いますが 組み方がわかりません 宜しくお願いします

  • 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です。