ベストアンサー ※ ChatGPTを利用し、要約された質問です(原文:SQLSERVER:自己結合した上でUPDATE) SQLServerでの自己結合を使用したUPDATE方法 2012/09/07 20:38 このQ&Aのポイント SQLServerでの自己結合を使用したUPDATE方法について教えてください。顧客マスタテーブルの特定の列を自己結合して更新する方法を知りたいです。UPDATE文で自己結合を使用してテーブルの特定の列を書き換える方法を教えてください。 SQLSERVER:自己結合した上でUPDATE こんにちは。ご存知の方いらしたら、お教えくださいませんか? SQLServer2000で、 次のような顧客マスタテーブル「Tab」があったとして、 Cd列をキーにして、 Sys列がS2のCustName列の値を、 S1のものに書き換えたいと考えております。 Sys Cd CustName --- -- --------- S1 aa Corp123 S2 aa Corporation123 S1 bb 456 K.K. ... これをこのようにしたい Sys Cd CustName --- -- --------- S1 aa Corp123 S2 aa Corp123 S1 bb 456 K.K. 下記のようにしてみたのですが、 「テーブル 'Tab'があいまいです」となります。 UPDATE [Tab] SET [CustName]=T2.[CustName] FROM [Tab] T1 INNER JOIN Tab T2 ON T1.[Cd]=T2.[Cd] WHERE T1.[Sys]='S2' AND T2.[Sys]='S1' どのようなSQL文にすれば、更新できるものでしょうか? 質問の原文を閉じる 質問の原文を表示する みんなの回答 (2) 専門家の回答 質問者が選んだベストアンサー ベストアンサー OrangeCup150 ベストアンサー率62% (109/174) 2012/09/07 21:11 回答No.1 とりあえず、あいまいなところをなくしてみては? UPDATE T1 SET T1.[CustName]=T2.[CustName] FROM [Tab] T1 INNER JOIN [Tab] T2 ON T1.[Cd]=T2.[Cd] WHERE T1.[Sys]='S2' AND T2.[Sys]='S1' ※テストしていません。SQL2005用のコードを参考にしました。 質問者 お礼 2012/09/10 09:40 ありがとうございます。無事更新できました。こういう書き方はできないものと思い込んでいました! 広告を見て全文表示する ログインすると、全ての回答が全文表示されます。 通報する ありがとう 1 その他の回答 (1) 原沢 信道(@nharasawa) ベストアンサー率53% (90/168) 2012/09/08 09:42 回答No.2 UPDATEの次は別名のT1を記入する必要があります。 質問者 お礼 2012/09/10 09:41 別名はここに書いてはいけないものと思い込んでおりました。 おかげさまで無事更新できました!ご教授ありがとうございます! 広告を見て全文表示する ログインすると、全ての回答が全文表示されます。 通報する ありがとう 0 カテゴリ [技術者向] コンピューターデータベースSQL Server 関連するQ&A 3つのテーブルを結合した場合のWHERE MySQLで3つのテーブルを結合した場合のWHEREがよくわかりません。 まず、下のような2つのテーブルがあるとします。 【テーブルaa】 ID | Name -------------- 1 | x 2 | y 3 | z 【テーブルbb】 ID | hizuke | category --------------------- 1 | stamp1 | a 1 | stamp2 | b 1 | stamp3 | c 2 | stamp1 | a 2 | stamp2 | d 3 | stamp1 | c この2つのテーブルを結合して、同じIDでhizukeが最大値のデータを抽出するクエリは、 http://okwave.jp/qa/q6918385.htmlを参考にして、 SELECT aa.Name, bb.category FROM bb INNER JOIN aa ON aa.ID = bb.ID where (bb.ID, bb.hizuke) in (SELECT bb.ID, max(bb.hizuke) FROM bb group by bb.ID ) ; でできました。 しかし、もう1つテーブルを結合すると期待した結果が得られなくなってしまいました。 【テーブルcc】 category | choice --------------------- a | ss b | tt c | uu というテーブルがあって、上のクエリで得られた bb.categoryと cc.categoryをリンクして、choiceを取得しようとしたのですがうまくいきません。 SELECT aa.Name, bb.hizuke, bb.category, cc.choice FROM bb INNER JOIN cc ON bb. category = cc. category INNER JOIN aa ON aa.ID = bb.ID where (bb.ID, bb.category, bb.hizuke) in (SELECT bb.ID, bb.category, max(bb.hizuke) FROM bb group by bb.ID ); というクエリでは、ダメなようです。 INNER JOINを入れ子にしたり、いろいろと試したのですがどうにもうまくいきません。 どうも私の力では解決困難なようです。どなたかヘルプを。 テーブル間の結合 次のような操作をしたいのですが、 Table1 CD 1 2 3 Table2 ID TT 1 1 1 2--ココ 2 1 2 2--ココ 結果 Table1とTable2を関連づけて CD ID TT 1 1 2 2 2 2 Table2のTTをMAX関数を使っての参照です。 ちなみに次のようなSQL文ではエラーとなりました。 select T1.CD , T2.ID , MAX(T2.TT) from Table1 T1 INNER JOIN Table2 T2 ON(T1.CD = T2.ID) GROUP BY T2.ID アドバイス等がありましたら、宜しくお願いします。 テーブル結合について SQL Serverで、メイン、サブ1、サブ2、サブ3、サブ4というテーブルがあり、以下のSQLを実行すると、メインにあるすべてのデータ(10列)が抽出されます。 SELECT * FROM メイン INNER JOIN サブ1 ON メイン.name1=サブ1.id INNER JOIN サブ2 ON メイン.name2=サブ2.id INNER JOIN サブ3 ON メイン.name3=サブ3.id しかし、上記のSQL文に追加して、 SELECT * FROM メイン INNER JOIN サブ1 ON メイン.name1=サブ1.id INNER JOIN サブ2 ON メイン.name2=サブ2.id INNER JOIN サブ3 ON メイン.name3=サブ3.id INNER JOIN サブ4 ON メイン.name4=サブ4.id とすると、メイン内の10列のうち、2列しか抽出されません。 サブ4を結合しても、一つ目のSQL文と同じ結果を抽出したかったのですが、どこがおかしいのでしょうか? SQL文がまずいのか、サブ4のテーブル内容のせいなのか、SQL Serverの設定がおかしいのか、さっぱり見当がつきません。 足りない情報がありましたら補足いたしますので、どうぞよろしくお願いします。 ネットワークエンジニアとは?技術職の未来を考える OKWAVE コラム 異なる二つのテーブルの結合について・・・ お世話になっております。 ちょっとややこしい質問になります。 「1」 Aと言うテーブルのAAと言うカラムから、$AAAと言うレコードを抽出致しました。ここまでは出来ました。(ここでの抽出結果を$CCCと致します。) 「2」 「1」の抽出結果($CCC)を元に、Bと言うテーブルのBBと言うカラムから、BBBと言うレコードも抽出し結合したいと考えております。 一番の問題は、「1」で出た結果(CCC)を元に、抽出する事が出来ません。 「1」のソースのみ完成してます。 $rs=$DB->query("SELECT * FROM `A` WHERE AA = '$AAA' ↑の抽出結果=$CCCを元に↓ $rs=$DB->query("SELECT * FROM `B` WHERE BB = '$CCC' 結合させたいんです!! セクションしているので結合できないとバラバラになってしまいます。。。。 ご教示お願い致します! inner join を使うのは分かるのですが・・・進めません。(泣) 列を結合させて外部キーを設定する方法 AテーブルのAA列とBB列を結合させて 見かけ上CC列を作成し BテーブルのDD列を外部キーをはりたいのですが そういった事は可能でしょうか? イメージ的には以下のような感じです。 Aテーブル AA列 decimal (1,0) DD列 decimal (3,0) 外部キー CC列(AA列+BB列)とDD列 Bテーブル DD列 decimal (4,0) 解り難くて申し訳ございませんがよろしくお願いします。 SQLserverのテーブル値関数の使い方 SQLserver2012でテーブル値関数を作成しています。 その際、実際の値ではなく、テーブルの列名を渡し、外部結合をしたいのですが、 上手くいきません。列名が指定できないのでしょうか。 教えてください。 --テーブル値関数 CREATE FUNCTION Func1 ( @User_name_no NVARCHAR(6), @String NVARCHAR(4000), @Flg NCHAR(1) ) RETURNS TABLE AS RETURN ( 処理 ) select * from func1('000001','aaaaaaaaaaaa','1'); 問題なく処理が行われます。 が 以下の様にテーブルの列名を指定し外部結合すると上手くいきません。 select B.* from USER_INFO_TBL A inner join func1(A.user_no,T1.user_data,T1.flg) B on A.user_no=B.User_no_no; とか select B.* from USER_INFO_TBL A inner join (select * from func1(A.user_no,T1.user_data,T1.flg)) B on A.user_no=B.User_no_no; メッセージ 4104、レベル 16、状態 1、行 4 マルチパート識別子 "A.user_no" をバインドできませんでした。 メッセージ 4104、レベル 16、状態 1、行 4 マルチパート識別子 "A.user_data" をバインドできませんでした。 となります。 どうすればよいか教えてください。お願いします。 mySQLの内部結合について 現在mySQLを使って、SQL文の勉強をしているのですがわからないことがあり、質問させていただきました。 テーブル同士をINNER JOINして結果を取得して、これに対してさらに別の処理(Whereなど)を行いたいのですが、うまくやり方がわかりません。 具体的にSQL文でいうとこんな感じです(ただしエラーが出て動きません)。 SELECT cmaster.comic_id,tags,title FROM mysql.comic_tag as ctag INNER JOIN mysql.comicmaster as cmaster ON ctag.comic_id = cmaster.comic_id AND WHERE tags = 'aa' この処理でやりたいことを説明するとcomic_tagとcomicmasterを結合して、その結果に対してさらにWhereでデータを絞るということしています。 このような場合はどのように処理をしたらいいんでしょうか?またjoinした後のデータを、既存のテーブルのように扱いたいのですが、なにか方法はないのでしょうか? 3テーブル外部結合方法について 3つのテーブルを外部結合したいのですが・・・、 こんがらがってしまいました。 A,B,Cの3テーブルがあり、A,B,Cの順に外部結合 (LEFT OUTER JOIN)したいのですが、 A,BのテーブルについてはWhere句の条件指定が 必要です。 Select From (Select AA.a From A AA Where b = xxxx) BB Left Outer Join (Select CC.b From B CC Where c = eeee and BB.a = CC.b) On ???? こんな感じでつまづいてしまいました・・・ ExcelVBAでSQLServerに追加するには。 教えてください! ExcelVBAの[intNo]と[strNamse]を ADOでSQLServerにレコード追加するにはどうしたらいいのですか? [ExcelVBA] Dim intNo as Integer = Range("A2")の値 Dim strName as String = Range("B2")の値 [SQLServer] Data Source= NetworkPC1 Initial Catalog= DataBase1 ID=aa Password=123456 テーブル= Syain 列1= No 列2= Name SQLServer2008のSQLを可変にする方法 SQL初心者です。 以下の3つのテーブルを条件によって結合したり、しなかったりを行いたいのですが、そもそもSQLServerのストアドプロシージャでそれが実現出来るのかもわかりません。。。。 どなたかご教授をお願い致しますm(_ _)m 使用するテーブルは以下の3つです。 1.ITEM_MST 項目: ITEM_CD, ITEM_NM, BUMON_CD 2.BUMON_MST 項目:BUMON_CD, BUMON_NM, CLASS_CD 3.CLASS_MST 項目:CLASS_CD, CLASS_NM, LOCAL_CD 実行するSP------------------------------------------------ test_SP( @引数1 , @引数2 ) SPの中で実行されるSQL-------------------------------------- SELECT ITM.ITEM_CD, ITM.ITEM_NM, BMN.BUMON_NM FROM ITEM_MST ITM INNER JOIN BUMON_MST BMN ON BMN.BUMON_CD = ITM.BUMON_CD WHERE ITM.CD = @引数1 ------------------------------------------------------------ 上記のSQLに対して、もし「@引数2 = 1」だったら CLASS_MSTテーブルを結合してLOCAL_CDの昇順で表示する以下のSQLを追加して表示させたいです。 INNER JOIN CLASS_MST CLS ON CLS.CLASS_CD = BMN.CLASS_CD ORDER BY CLS.LOCAL_CD そもそも引数によって、SQL文の結合するテーブルを変更する事は可能なのでしょうか? 調べ方が悪いのか、ネットで検索しても解決方法がわかりませんでした。。。 どうかご教授お願い致します。 SELECT(結合)について 次のような操作がしたいのですが、 TestOya t1 t2 1 A 2 B TestKo1 k11 k12 k13 1 1 AA 1 2 BB 2 1 CC TestKo2 k21 k22 k23 1 3 AAA 1 4 BBB 1 5 CCC 2 2 DDD 取得したい結果 t1 t2 betumei1 betumei2 betumei3 1 A 1 1 AA 1 A 1 2 BB 1 A 1 3 AAA 1 A 1 4 BBB 1 A 1 5 CCC 2 B 2 1 CC 2 B 2 2 DDD betumei1には、k11またはk21 betumei2には、k12またはk22 betumei3には、k13またはk23 となるような結合がしたいのです。 アドバイスあれば宜しくお願いします。 2つのテーブルを結合して最大値を取得したい 2つのテーブルを結合(INNER JOIN)して、ある列の最大値を取得する方法を教えてください。 例えば、 出荷ファイルと出荷明細ファイルの2テーブルで、出荷日の列をキーとして結合します。 この2テーブルで出荷番号という列の最大値を取得したいのです。 具体例では、 出荷日が2テーブルとも8/6があるとして、 出荷ファイル.出荷番号 の最大値が”5”で、 出荷明細ファイル.出荷番号の最大値が”6”の場合、 結果として、”6”を取得できれば良いのです。 よろしくお願いします。 AIは使う人の年齢や市場にも影響する?人工知能の可能性 OKWAVE コラム SQL:複数行のデータを一つの文字列にまとめたい 複数行のデータを一つの文字列にまとめる方法を教えてください。 ※環境SQLServer2005 例: ID DATA AA XXX BB YYY AA ZZZ 次のようなテーブルがあるとき、IDがAAであるものを一つの文字列 "XXXZZZ" にまとめたデータにSQLで加工したいです。 ACCESS 結合ができません。 祖母が句会に入っていて、私はACCESSを触っているだけなのですが、祖母の周囲にパソコンを使える人が居ないため、頼まれました。 プログラムの変更なのですが、ACCESSを作った人は退会されているので、困り果てております。 ・現在の時間帯が、第2希望まで選べているが、それが第5希望まで選べるようになった。 ・テーブル「T時間M」から「T時間M-4」まであり、-2からは、第2希望から参照している。 クエリの構造については、画像で添付しましたが、仮名に変更してあります。 コードについては、SQLで組まれており、LEFT JOINとなっていますが、3つ以上の結合を行うと、フォームでは「Name?」となってしまいます。 コードの記述についてですが、SQLの構文部分を書き出します。 SQL = "SELECT T会員M.名前," _ & "T男女M.男女, T会員M.年齢, [T時間M.項目C] &" _ & " T時間M.回数 AS 第1, T会員M.当落1," _ & " [T時間M_1.項目C] & T時間M_1.回数 AS 第2, T会員M.当落2" _ & " FROM T時間M INNER JOIN (T男女M INNER JOIN (T会員M LEFT JOIN T時間M AS T時間M_1 ON" _ & " T会員M.第二希望時間CD = T時間M_1.時間id) ON T男女M.男女C = T会員M.男女C) ON" _ & " T時間M.時間id = T会員M.第一希望時間CD " _ この後の記述は & "WHERE ~省略 & " ORDER BY ~省略 Me.RecordSource = SQL となっています。 SQLの実行速度 XMLを解析し、テーブル内を検索するシステムを 作成しているのですが、 ストアドプロシージャ内でSQL文を作成し実行するのと ASP.NET などからSQL文を作成して実行するのとでは、 実行速度に差はでるのものなのでしょうか。 ・SQLServer 2005 ・SELECT の対象テーブルは2~3つのテーブルをINNER JOIN して使う。 ・検索対象の列は実行のたびに異なる。 よろしくおねがいします。 同じ構成のテーブルを結合する AとBという全く同じ列構成からなるテーブルの結合を考えています。 イメージとしては、Aのレコードが全て表示された下にBのレコードが列挙されるような感じです。 "INNER JOIN"、"LEFT OUTER JOIN"で行った結果、AとBでキーに同じ値を持つと、どちらかの値で上書きされてしまうみたいなのでイメージ通りにはいきませんでした。また、"CROSS JOIN"ではAの右側にBの内容が追加されてしまうのもあって、イメージ通りにできませんでした。 どなたかこのSQL文が分かる方はお教えいただけないでしょうか? よろしくお願いします。 データベース:SQL Server UPDATEで困っています 下記の2つの表があり、 表Aから伝票番号毎に集計したTAXで、 同じ伝票番号をもつ表BのTAXを、一括更新しようと考えています。 表Bについては、伝票番号の中で最小の明細番号の行のみ 更新しなければなりません。 SQL-SERVERでは、下記のSQLでどうやら大丈夫そうなのですが、 Oracleでは、更新どころかエラーが発生してしまい、 途方に暮れています。 どなたか、ご教授頂けないでしょうか? よろしくお願い致します。 update B set 税額 = AA.税額合計 from B inner join (select 伝票番号, min(明細番号) as 最小明細番号 from B group by 伝票番号) as BB on BB.伝票番号 = B.伝票番号 and BB.最小明細番号 = B.明細番号 inner join (select 伝票番号, sum(税額) as 税額合計 from A group by 伝票番号) as AA on AA.伝票番号 = B.伝票番号 (表A) ・伝票番号 ・明細番号 ・TAX (表B) ・伝票番号 ・明細番号 ・金額 ・TAX sqlserverにはグループ集計のfirstとlastがありません?? accessユーザーです sqlserverに組み替えているなかでaccessでは今までグループ集計をクエリーで作成していました select first(フィールド1) as AA,last(フィールド2) as BB from FFテーブル group by フィールド3 ところがsqlserverにはfirstとlastがありません?? どのようにすればよいのかご教授おねがいします firstとlastはない場合、ほかの方法で結果がでればどの方法でもかまいません。 よろしくおねがいします 内部結合する時の結合条件と制約条件について 内部結合する時の結合条件と制約条件について 下記の例の場合の結合条件と制限条件の書き分けを 教えて下さい。 table1: no|type --------- 1| A 2| B 3| C 4| A 5| C table2: no|type|name|locale ------------------- 1| A |ネコ| ja 2| B |イヌ| ja 3| C |トリ| ja 4| A |cat | en 5| B |dog | en 6| C |bird| en 取得したいデータ: no|type|name ------------- 1| A |ネコ 2| B |イヌ 3| C |トリ 4| A |ネコ 5| C |トリ SQL: SELECT t1.no, t1.type, t2.name FROM table1 t1 INNER JOIN table2 t2 ON t1.type=t2.type AND t2.locale='ja' または SELECT t1.no, t1.type, t2.name FROM table1 t1 INNER JOIN table2 t2 ON t1.type=t2.type WHERE t2.locale='ja' となると思うのですが、 t2.locale='ja'の条件は 結合条件とするのと制限条件とするのとで 違いがあるのでしょうか? もし違いがない場合はどちらが一般的でしょうか? よろしくお願いいたします。 SQLServer2005のSQL文での別名の取り扱い 現在VB.net2005とSQLServer2005にてプログラムを組んでいます。 以下のように、サブクエリにて抽出されたStockテーブルと Tagテーブルを結合するSQL文を組みました。 *行頭は列番号です。 01- SELECT * FROM 02- ( 03- SELECT A1.*, A3.* FROM 04- ( 05- SELECT A2.* FROM stock AS A2 06- WHERE A2.StockDay < #日付# '【SQLserverで流す時は "CONVERT(DATETIME, '日付')"】 07- AND A2.ShopCode = '店番号' 08- ) AS A1 09- LEFT JOIN tag AS A3 10- ON A1.StockNo = A3.StockNo 11- ) AS S1 これだとACCESS2000のクエリ上では正しく実行できます。 しかし、.net2005のサーバエクスプローラ上で上記SQL文を流しても、 「列 'StockNo' が 'S1' に複数回指定されました。」 とエラーが出てしまい実行することができません。 行03を "SELECT A1.* FROM" にするとSQLServer2005でも動きますが、 tagテーブルのフィールドが結果に含まれません。 tagテーブルのフィールドも結果に含みたいです。 どなたか原因や回避方法をご存知の方いらっしゃいましたら、 お手数ですが是非ともご教示頂きたいです。 よろしくお願い致します。 注目のQ&A 「You」や「I」が入った曲といえば? Part2 結婚について考えていない大学生の彼氏について 関東の方に聞きたいです 大阪万博について 駅の清涼飲料水自販機 不倫の慰謝料の請求について 新型コロナウイルスがもたらした功績について教えて 旧姓を使う理由。 回復メディアの保存方法 好きな人を諦める方法 小諸市(長野県)在住でスキーやスノボをする方の用具 カテゴリ [技術者向] コンピューター データベース SQL ServerOraclePostgreSQLMySQLNoSQLその他(データベース) カテゴリ一覧を見る OKWAVE コラム 突然のトラブル?プリンター・メール・LINE編 携帯料金を賢く見直す!格安SIMと端末選びのポイントは? 友達って必要?友情って何だろう 大震災時の現実とは?私たちができる備え 「結婚相談所は恥ずかしい」は時代遅れ!負け組の誤解と出会いの掴み方 あなたにピッタリな商品が見つかる! OKWAVE セレクト コスメ化粧品 化粧水・クレンジングなど 健康食品・サプリ コンブチャなど バス用品 入浴剤・アミノ酸シャンプーなど スマホアプリ マッチングアプリなど ヘアケア 白髪染めヘアカラーなど インターネット回線 プロバイダ、光回線など
お礼
ありがとうございます。無事更新できました。こういう書き方はできないものと思い込んでいました!