SQL初心者のためのTable1とTable2のデータ修正SQL

このQ&Aのポイント
  • SQL初心者の方に向けたTable1とTable2のデータ修正に関するSQLをご紹介します。Col1が重複していない場合と重複している場合の修正方法を解説します。
  • Table1とTable2のデータ修正には、Col1が重複しているかどうかによってSQLが異なります。Col1が重複していない場合は、単純なUPDATE文で修正できますが、重複している場合はサブクエリを使用して修正する必要があります。
  • Col1が重複していない場合の修正SQLは、Table2のData1とTable1のCol1が一致する行のCol2を取得し、Data2にセットするというものです。一方、Col1が重複している場合の修正SQLは、Col1の重複結果の1行目のCol2を取得してData2にセットするというものです。これらのSQLを組み合わせることで、Table2のデータを修正することができます。
回答を見る
  • ベストアンサー

SQL初心者です。

【Table1】 Col1 Col2 Aa A Ab A Ba B Bb B Ca C Ca D 【Table2】(Data1は固定) Data1 Data2 Aa A Ab B→A Ba C→B Bb A→B Ca B→C Ca C ※Col1に重複がある場合、重複結果の1行目のレコードをData2に入れる (今回の場合CをData2に入れる) Data1は固定で、Table1を使ってData2を上記の様に修正するSQLが書けなくて困っています。 Col1が重複してない場合の修正するSQLを書いてみましたが(合っているかはわかりませんが...)、 重複する場合のSQLも追加して最終的に1つのSQLで、すべて修正できるようにしたいです。 update Table2 T2  set Data2=  (select Col2 from Table1  where Col1=   (select Col1 from Table1 T1   where T2.Data1=T1.Col1   group by T1.Col1   having count(T1.Col1)=1  ) ) わかりにくい部分もあると思いますが、ご教授お願いします。

  • Oracle
  • 回答数1
  • ありがとう数0

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

  • ベストアンサー
  • yamada_g
  • ベストアンサー率68% (258/374)
回答No.1

>※Col1に重複がある場合、重複結果の1行目のレコードをData2に入れる の「1行目」の定義がハッキリ書かれていませんが、 例を見ると一番小さな値ということでいいのでしょうか。 それなら単純に、 UPDATE Table2 T2 SET Data2 = (SELECT MIN(T1.Col2) FROM Table1 T1 WHERE T1.Col1 = T2.Data1); でいいのではないでしょうか。 ただ、このSQLだとTable1にTable2のData1と一致するデータがない場合は NULLに更新されてしまうので気を付けてください。 もし、そういうデータが存在するのであれば UPDATE文のWHERE句にEXISTS条件を書くようにしてください。

関連するQ&A

  • SQL文の作成について

    はじめまして SQL Serverを使用テーブルの更新クエリを作っています。 ◆質問 副問合せの結果をIn句で見ていますがExists句の方がパフォーマンスがあるといわれているので直したいと思っています。 可能でしょうか? ◆SQL文 UPDATE [TABLE_A] SET Data = null WHERE Code IN (Select Code From [TABLE_B] B, [TABLE_C] C Where (B.Start <= GetDate() AND C.End >= GetDate()) AND (B.TimeCode = C.TimeCode)) ◆KEY [TABLE_A].Code = [TABLE_B].Code [TABLE_B].TimeCode = [TABLE_C].TimeCode ◆[TABLE_A] Code Data 001 100 002 200 003 300 004 400 <- DataをNullにする ◆[TABLE_B] Code TimeCode 001 AAA 002 AAA 003 AAA 004 BBB <- 今日2/18ヒット 001 CCC 002 CCC ◆[TABLE_C] TimeCode Start End AAA 2009/1/1 2009/2/15 BBB 2009/2/13 2009/2/20 <- 今日2/18ヒット CCC 2009/2/19 2009/10/5 データは[TABLE_A] 6万件、[TABLE_B]が20万件、[TABLE_C]が100件程度です。 夜遅くにすみませんがお願いします。

  • 単一行副問合せにより2つ以上の行が返されます。エラーになります。

    単一行副問合せにより2つ以上の行が返されます。エラーになります。 お世話になります。 下記SQLを実行するとエラー”単一行副問合せにより2つ以上の行が返されます。” になってしまいます。 ご教授お願いします。 table1のcol01にtable2のcol01を table1のcol02にtable2のcol02を table2のcol03が3、table2のcol05が5で且つ table1のcol06とtable2のcol06が一致する場合に 変更したく下記SQLを作成しました。 update table1 set (col01,col02) = (select col01,col02 from table2 t2,table1 t1 where t2.col03 = 3 and t2.col05 = 5 and t2.col06 = t1.col06) where t1.col06 in (select col06 from table2); 以上 よろしくお願いします。

  • SQL select 2つの日時データの結合

    SQLで2つの日時データについて、片方の日時に一番近い別データのレコードを結合して抜き出したいです。 <Table1> 日時A data1 2020/07/01 10:00:00 1000 2020/07/01 11:00:00 1000 <Table2> 日時B col1 2020/07/01 9:50:00 AAA 2020/07/01 10:05:00 BBB 2020/07/01 11:10:00 CCC 上記2つのようなデータがある場合、下記のようなSELECT結果を取得したいです。 日時A data1 日時B col1 2020/07/01 10:00:00 1000 2020/07/01 9:50:00 AAA 2020/07/01 11:00:00 1000 2020/07/01 10:05:00 BBB この場合、どのような構文を使用したらよいでしょうか? お手数ですが、よろしくお願いいたします。

  • こういう場合のSQLの書き方。

    はまっています。お知恵を貸してください。 Oracle8i WindowsNT4.0です。 tbl_testというテーブルがあります。 データが以下のように入っています。 col1   col2   col3 --------------------------------- A     B     C      A B     A     A C この時、col1 col2 col3それぞれのカラムの中で、 Aという値が何個あるか数えたいのです。 今は以下のように三つにわけてセレクトしていますが、 これをひとつの式にまとめたいのですが、可能でしょうか? UNIONしても欲しい答えは返ってきません。 =========================== SELECT COUNT(col1) AS col1 FROM tbl_test WHERE col1 = 'A' =========================== SELECT COUNT(col2) AS col2 FROM tbl_test WHERE col2 = 'A' =========================== SELECT COUNT(col3) AS col3 FROM tbl_test WHERE col3 = 'A' 欲しい答えは、 col1   col2   col3 ----------------------- 1     2     1 です。 なお、家に検証環境が無いので、検証&お礼は明日のお昼くらいになると思います。 宜しくお願い致します。

  • 条件のある検索方法

    たびたびお世話になります。 PL/SQLで以下のような検索をしたいのですが、 1つのSQLで実現するにはどのようなSQL文を 書けばいいですか?初心者ですが、よろしくお願いします。 ちなみに、Indexはありません。TABLE_AとTABLE_Bの列は同じです。 ・COL1='plan'、COL2='hokan'でTABLE_Aを検索し、  (1)データがあればTABLE_AのCOL3,COL4をTABLE_Bの   COL3,COL4と結合してTABLE_BのCOL0の値を取得  (2)データがなければCOL1='plan'、COL2='hokan'で  直接TABLE_Bを検索しCOL0の値を取得 よろしくご教示ください。

  • SQL 表の結合

    SQLで2つの表から条件に合ったデータを取り出し、同じ列に表示させたいのですが、 どうやっても外部結合のようにすることしかできませんでした。 取り出したデータを縦に結合?させることはできるのでしょうか? 例) dataは月の上旬中旬下旬でそれぞれabcとします。 入力値はmonthとdayで、これらからuriageを選択します。 dataの取りうる値はa,b,c,ab,bc,abcとします。    table:A 売上表            table:B 上旬中旬下旬判断 ---------------------------   -----------  key | data | month | uriage   day | data ---------------------------    -----------   1 |  a  |  1  |  500      1 |  a   2 |  ab  |  1  |  800     … |  …   3 |  bc  |  1  |  400     10 |  a   4 |  c  |  1  |  100     11 |  b   5 |  abc |  1  |  900     … |  …   … |  …  |  …  | …     31 |  c ---------------------------    ----------- month = 1 , day =5のとき  table:Bより   SELECT data FROM table:B WHERE day = 5 としてdata "a" を得ます。 この"a"と同じdataを持つuriageを表示させたいので   SELECT uriage FROM table:A   WHERE month = 1 AND data = (SELECT data FROM table:B WHERE day = 5) として  table:query1  --------    uriage  --------    500  -------- を得ました。 ここまでは良いのですが、これに付け加えて、 table:Bから取り出したdata "a"をtable:Aのdataが含むとき(data = a,ab,abcのとき) その全てのuriageを表示させたく、 ワイルドカードを使おうと   SELECT uriage FROM table:A   WHERE month = 1 AND data = %(SELECT data FROM table:B WHERE day = 5)% 等としてみたのですが、上手くいきませんでした。 そこで、別のクエリーを作って   SELECT uriage FROM table:A   WHERE month = 1 AND data = 'ab' AND data = 'abc' として  table:query2  ---------   uriage  ---------    800  ---------    900  ---------- を得ました。 そして、最後に、 得られた2つの表をまとめて  ---------   uriage  ---------    500  ---------    800  ---------    900  --------- としたいのですが、   SELECT uriage, uriage FROM query1, query2 とすると  ------------------   uriage | uriage  ------------------    500  |  800    500  |  900  ------------------ となりますし、UNIONは使い方がよくわからないためシンタックスエラーにしかならず...。 そもそも、縦に結合?はできるのでしょうか??? あれこれ試してみたのですが、詰まってしまったので、 どなたか知恵をお貸しください。

  • 重複レコードを高速で取得するSQL

    Access(mdb)から約2万件レコードのあるテーブルがあるとします。 列数は20ほど。 その中から、3つの列において重複しているレコードを取得したいのですが、 高速に取得する方法はありますでしょうか? (VB.NETで、重複レコードをユーザーに示す処理を作成したいのです) 以下のSQLを試したところ、1分以上時間がかかってしまいました。 ----------------------------- SELECT * FROM テーブルA table1 WHERE EXISTS ( SELECT * FROM テーブルA table2 WHERE table1.列A = table2.列A   table1.列B = table2.列B   table1.列C = table2.列C GROUP BY table2.列A HAVING COUNT(table2.列A) > 1 ) ----------------------------- アドバイスをお願いします。

  • SQLの書き方

    T1(項目a&b) T2(項目c&d) というテーブルが存在しており、下記のような形でデータが存在しています。 T1 a | b ========== 1 | jj 2 | kk 3 | ll T2 c | d ========= 1 | a1 2 | a2 3 | a3 T1(a)とT2(c)で結合させて、b を d の値で書き換える場合は、どのように記述したら良いのかご教示下さい。 update T1 set b = 'ok' where a in ( select c from T2 where d = 'a2') というように、固定で項目を書き換える所までは出来たのですが、後一歩が上手くいきません。

  • SQL文を教えてください。

    特定の日付Xを指定した場合、 以下のような結果になるSQL文を教えてください。 よろしくお願いします。 1) 日付X = 2003-12-17 の場合 ID table_A_DATE table_B_DATE table_C_DATE ------------------------------------------------ 001 2003-12-10 2003-12-12 2003-12-14 002 2003-12-15 ---------- 2003-12-16 003 2003-12-06 2003-12-10 ---------- 004 2003-12-08 ---------- ---------- 2) 日付X = 2003-12-11 の場合 ID table_A_DATE table_B_DATE table_C_DATE ------------------------------------------------ 003 2003-12-06 2003-12-10 ---------- 004 2003-12-08 ---------- ---------- table A(テーブルAには全ユーザのデータがあります) ID DATE ------------------ 001 2003-12-10 002 2003-12-15 003 2003-12-06 004 2003-12-08 table B ID DATE ------------------ 001 2003-12-12 003 2003-12-10 table C ID DATE ------------------ 001 2003-12-14 002 2003-12-16

  • oracle sqlで先頭の1件を取得

    こんにちはみなさん。 現在、Oracle10gR2を使用しています。 そこで、以下のようなテーブルが存在します。 table_A(明細テーブル) denday | cd | suu | kingaku 2011/03/05 | 1| 1| 1000 2011/03/10 | 1| 2| 2000 table_B(マスタ) cd| henkoday | nm 1 | 2011/03/01| testA 1 | 2011/03/02| testB 1 | 2011/03/06| testC 上記マスタはcd、henkodayで管理しています。 上記table_Aとtable_Bを結合したいと思います。 そこで select t1.* ,t2.* from (select * from table_A order by denday) t1, (select * from table_B order by cd,henkoday desc) t2 where t1.cd=t2.cd and t1.denday>=t2.henkoday とした場合、マスタの3件分、明細データの重複ができてしまいます。 それを、直近の該当マスタのみ参照したいのですが、 以下のようなデータ抽出 table_A(明細テーブル)     table_B(マスタ) denday | cd | suu | kingaku | cd | henkoday | nm 2011/03/05 | 1 | 1 | 1000 | 1 | 2011/03/02 | testB 2011/03/10 | 1 | 2 | 2000 | 1 | 2011/03/03 | testC そのSQLがわかりません。 どうかよろしくお願いします。