• 締切済み

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

みんなの回答

  • jamshid6
  • ベストアンサー率88% (591/669)
回答No.1

書くとすれば以下の通りですが、レスポンスが改善するかどうかはオプティマイザ次第です。 UPDATE [TABLE_A] SET Data = NULL FROM [TABLE_A] A WHERE EXISTS (SELECT NULL FROM [TABLE_B] B INNER JOIN [TABLE_C] C ON C.TimeCode=B.TimeCode WHERE B.Code=A.Code AND C.Start <=GetDate() AND C.[End] >= GetDate())

uchan777
質問者

お礼

夜遅くのご回答ありがとうございます。 こちらの環境で早速試してみます。 本当にありがとうございました。

関連するQ&A

  • Null同士の結合

    お力貸してください。 [Table111] データA   データB    データC     Name111 Null     1        5         あああ 2       Null      6         いいい 3       4        7         ううう [Table222] データA    データB     データC     Name222 Null      1         5          AAA 2        Null       6          BBB 3        4         7          CCC Table111とtable222をデータAとデータBとデーターCの3つで結合して 新しいテーブルをつくりたいです。 [TableC] データA    データB   データC  Name111   Nam222 Null       1       5      あああ       AAA 2         Null     6      いいい       BBB 3         4       7      ううう       CCC Nullもデーターとして認識させたいのですが、うまくいきません。 できれば、新しくテーブルを作ったりしたくないです。 お知恵をかしてください。よろしくおねがいします。

  • OraclのSQL文について(No3)

    何度も恐縮です。また、違った事が出てきました。(^^; Oracl の SQL文について、教えて下さい。 [A]テーブルに [CODE] と [NAME]フィールドがあるとします。 内容は、 A-1 NAME-1 A-2 NAME-2 A-3 NAME-3 と、します。 [B]テーブルに [CODE] と [NOUKI] と [KIN] と [CODE2] フィールドがあるとします。 内容は、 A-1 2005/01/01 100 AAA A-1 2005/01/02 200 BBB A-2 2005/01/01 300 CCC A-2 2005/01/10 400 DDD A-2 2005/12/10 500 EEE と、します。 結果が、 A-1 NAME-1 300 AAA A-2 NAME-2 1200 CCC と、なる様にする為には、どういうSQL文を書けば良いのでしょうか ? つまり、[CODE2]のフィードは一番最初を表示させたいのです。 SELECT A.CODE, A.NAME, B.CODE2, SUM(B.KIN) FROM A, B WHERE A.CODE = B.CODE GROUP BY A.CODE, A.NAME,B.CODE2 ORDER BY A.CODE と、すれば A-1 NAME-1 AAA 100 A-1 NAME-1 BBB 200 A-2 NAME-2 CCC 300 A-2 NAME-2 DDD 400 A-2 NAME-2 EEE 500 と、言う結果がでます。(当然ですが) これは、1つの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つ追加される予定なので もっとすっきり更新できる方法を教えていただけませんでしょうか? よろしくお願いします。

  • Pro*CでのSQL文について

    こんにちは。 Pro*CでSQLを実行しようとしています。 varchar table_data[200]; (略) EXEC SQL SELECT aaa, bbb, ccc INTO :table_data FROM SAMPLE (略) のようにしてSAMPLEテーブルの列(aaa,bbb,ccc)を変数table_dataに 格納したいと考えています。(もちろん、現在はtable_dataにはaaaの値しか 入っていません(泣)) こういった漢字で変数table_dataに選択列(複数)を取得できるような考えは あるのでしょうか? ちなみにaaa,bbb,cccの区切り文字は考えなくても構いません。 ご多忙でしょうが、どのたかご回答宜しくお願い致します。

  • Oracle[10g]のSQL文について(改めて)

    すみません。[B]テーブルの作成がおかしい様でしたので、 改めて質問させて下さい。 Oracle[10g]のSQL文についての質問です。(No.???) [A]テーブルに [CODE](KEY) [CODE2] [NAME] のフィールドがあります。 A-1 B-1 NAME-1 A-2 B-2 NAME-2 A-3 B-3 NAME-3 [B]テーブルに [CODE3](KEY) [NAMEB] のフィールドがあります。 B-1 NAME-B-1 B-2 NAME-B-2 [C1]テーブルに [NO](KEY) [LINE](KEY) [CODE] のフィールドがあります。 X 1 A-1 X 2 A-3 Y 1 A-2 結果が [NO/LINE/CODE/NAMEB] X 1 A-1 NAME-B-1 X 2 A-3 (NULL) と、なる様にしたいのです。 SELECT C1.NO, C1.LINE,C1.CODE, Tx.NAMEB FROM C1 , ( SELECT C1.CODE, TNMx1.NAMEB FROM C1, ( SELECT CODE, CODE2, CODE3, NAMEB FROM A, B WHERE A.CODE2 = B.CODE3 ) TNMx1 WHERE C1.NO = 'X' AND C1.CODE = TNMx1.CODE(+) ) Tx WHERE C1.NO = 'X' GROUP BY C1.NO, C1.LINE,C1.CODE, Tx.NAMEB と、考えたのですが、何故か結果が X 1 A-1 (NULL) X 1 A-1 NAME-B-1 X 2 A-3 (NULL) X 2 A-3 NAME-B-1 4行もでてしまいます。 問題は、[B]テーブルです。 宜しくお願い致します。

  • 現在PCサイトを作成しています。

    aaa.com?code=AAA aaa.com?code=BBB aaa.com?code=CCC ひとつのURLで3種類のコードを扱っています。 Code=AAAが表示する画像は「111」 Code=BBBが表示する画像は「222」 Code=CCCが表示する画像は「333」 と表示させたいのですがjavascriptの組み方が分かりません。 どのようにすればいいのでしょうか?

  • SQL 複数条件を設定

    PostgreSQLを使用しております。 それぞれ、TABLE1とTABLE1があり、 TABLE1 a-1   a-2   b-1    ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄    1   bbb   aaa   ddd      2   ggg   bbb   ccc        3   bbb   mmm  ddd       4   ggg   mmm  ccc    : TABLE2   a-1   a-2        c-1   ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄     1   bbb   aaa        eee         2   ggg   mmm       qqq    : 質問1. TABLE1.a-1=TABLE2.a-1 and TABLE1.a-2=TABLE2.a-2 を条件にして結合 したい場合、どのように結合すればよいのか。 期待結果 a-1   a-2   b-1  c-1   ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄    1   bbb   aaa   ddd  eee    2   ggg   bbb   ccc   ※    3   bbb   mmm  ddd   ※    4   ggg   aaa   ccc   qqq ※は空白でもNULLでもよい 質問2. 上記が可能な場合にさらに質問です。 TABLE1およびTABLE2が、SELECT,WHEREによって抽出されたものとした場合、 1つのSQL文で質問1と同様の出力にするにはどのように結合すればよいのか。(はたまた無謀なのか) 知識不足のため悩んでいる状況なので、 どなた様か知識がある方にご教授願いたく思います。

  • 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 この場合、どのような構文を使用したらよいでしょうか? お手数ですが、よろしくお願いいたします。

  • 並び替えで教えて下さい。

    並べ替えで悩んでます。ご教授下さい。 下記のようなA、B、Cというフィールドがあり それぞれデータが入っているとします。 取得する際の並び替えですが、 A B C --------------------- aaa 1 6 bbb 1 5 ccc 1 4 aaa 2 4 bbb 2 6 ccc 2 5 ORDER BY Aとすると・・・ aaa 1 6 aaa 2 4 bbb 1 5 bbb 2 6 ccc 1 4 ccc 2 5 ORDER BY Bとすると・・・ aaa 1 6 bbb 1 5 ccc 1 4 aaa 2 4 bbb 2 6 ccc 2 5 ORDER BY Cとすると・・・ aaa 2 4 ccc 1 4 bbb 1 5 ccc 2 5 aaa 1 6 bbb 2 6 となります。 私がやりたいのは下記の順で並べ替えしたいのです。 ccc 1 4 ccc 2 5 bbb 1 5 bbb 2 6 aaa 1 6 aaa 2 4 つまりORDER BY B、Cの結果の1つ目のレコードの AでGROPE BYするような感じです。 方法をご教授頂きたいと思います。 よろしくお願いします。

  • エクセルVBAで重複する名前に(2)、(3)等をつける方法は?

    こんにちは。お世話になります。 以下のようなデータ(約1500件)があります。 データは分類と名称でソート済みです。 同じ分類のなかで同じ「名称」があった場合、B列の名称の直後に同一セル内で(2)や(3)を順に振っていくマクロを教えていただきたいのです。(1)は不要です。 下記の例では、ううう(2)、ううう(3)といった具合です。 よろしくお願いします。 A列 B列 C列 分類 名称 データ1 aaa あああ a aaa いいい b aaa ううう a aaa ううう a aaa ううう a aaa えええ b bbb かかか a bbb かかか a bbb ききき a bbb くくく b ccc さささ a ccc ししし b ccc すすす a ccc すすす a ccc すすす a ccc すすす a ccc せせせ a