ももたろう


SELECTの結果をUPDATEで使用す  2004-01-07 03:28:51  No: 111083

SQLの記述でお教えください。

SELECT文にて返された値を、UPDATE文で利用したいのですが、
うまく動いてくれません。
どのように記述すればいいのでしょうか?

srt = "SELECT MASTER_TANTO.担当者名_漢字 From MASTER_TANTO WHERE MASTER_TANTO.担当者コード = '" + username + "'"
MYSQLUP = "Update TBLKAIIN Set TBLKAIIN.架電中サイン = 1,TBLKAIIN.最終アクセス担当者 = '" + srt + "' WHERE TBLKAIIN.カード番号 = '" & txtカード番号(0).Text & "'"


z  2004-01-07 17:19:19  No: 111084

> TBLKAIIN.最終アクセス担当者 = '" + srt + "' WHERE 
この部分を

 WHERE TBLKAIIN.最終アクセス担当者 IN (" + srt + ") AND

にしたらどうでしょうか?

それと、これはVBではなくSQLの質問だと思うので
そっち関連の掲示板が適切かもしれません。


ももたろう  2004-01-07 23:18:24  No: 111085

z 様

ご回答いただきありがとうございます。
こちらの説明不足ですが、SELECTで取得した値を
UPDATE文でSETしたいのでWHERE以降に記述しては
SETされなくなります。

確かにSQLの質問でこの場にはふさわしくないのですが
なんとか引き続きお願いできないでしょうか。


  2004-01-08 00:37:01  No: 111086

すみません、いまいちよくわかりません。

1)MASTER_TANTO、TBLKAIINの構造とusername、txtカード番号(0)
    との関係性がよくわかりません。
2)また、UPDATE文でどのような処理をしたいのかもわかりません。


特攻隊長まるるう  2004-01-08 18:43:51  No: 111087

とりあえずSQL文の書き方が分からない場合に
何が入ってくるか分からない変数なんかを間に入れられても
分かりにくく不親切。…ただそうするとホントに場違いな
質問になっちゃうね(汗)。zさんもおっしゃるように
SQL文の場合、テーブル構造の説明がないとなかなか
こちらに意図が伝わりません。
ま、参考程度に…

> TBLKAIIN.最終アクセス担当者 = '" + srt + "' WHERE 
がなぜダメなのかは理解できてますよね?これでは
TBLKAIIN.最終アクセス担当者が文字列『SELECT MASTER_TANTO.担当者名_漢字 From MASTER_TANTO WHERE MASTER_TANTO.担当者コード = '" + username + "'』
そのものと一致するという条件になってしまいます。
VB側では文字列でSQL文を編集しますが、クエリ実行時に
SQLの言語として解釈し直さなくてはいけません。
SQLの勉強をおろそかにしてVBの感覚でSQL文を編集していると
この辺を混同するようですので気をつけてください。

で、サブクエリ srt で取れてくるのはテーブルです。ももたろうさんは
これを文字列と解釈してそうなので、ここも注意しておいて下さい。

あくまで利用する全ての情報を持った(できれば最小の)テーブルを
用意し、それから内部のデータを操作する意識を持っておいた
方が良いでしょう。
今回、内部結合とその条件により制限をかけてみました。
これで意図した通りの操作ができるかどうか分かりませんが、
これを参考に色々考えてみてください。

[SQL]
UPDATE TBLKAIIN
   SET TBLKAIIN.架電中サイン = 1,
       TBLKAIIN.最終アクセス担当者 = MASTER_TANTO.担当者名_漢字
       FROM MASTER_TANTO INNER JOIN TBLKAIIN 
           ON MASTER_TANTO.担当者コード = ' usernameXXX ' 
   WHERE TBLKAIIN.カード番号 = ' txtカード番号XXX '


ももたろう  2004-01-10 08:19:18  No: 111088

特攻隊長まるるう  様
丁寧にお教えいただきましてありがとうございました。
>> TBLKAIIN.最終アクセス担当者 = '" + srt + "' WHERE 
> がなぜダメなのかは理解できてますよね?これでは
>TBLKAIIN.最終アクセス担当者が文字列『SELECT MASTER_TANTO.担当者名_漢字>From MASTER_TANTO WHERE MASTER_TANTO.担当者コード = '" + username >+ "'』
>そのものと一致するという条件になってしまいます。

大変よくわかりました。
私はSQLの式の文字そのものを代入していただけなんですね。
ほんとなんと言っていいやら。。。

>あくまで利用する全ての情報を持った(できれば最小の)テーブルを
>用意し、それから内部のデータを操作する意識を持っておいた
>方が良いでしょう。

よくわかりました。(大変勉強になります。)

がんばってTRYしているのですが、今
クエリ式  構文エラー  演算子がありません
というエラーに悩まされています。

もう少しがんばります。


ももたろう  2004-01-13 20:07:32  No: 111089

お世話になっております。ももたろうです。
あれから試行錯誤していたのですが、どうもエラーになってしまいます。
何度も申し訳ございませんが、お助けいただけないでしょうか。

【エラー内容】
UPDATE実行時にエラーMSGが表示される。
「実行時エラー '-2147217900(80040e14)':
 クエリ式'MASTER_TANTO.担当者名_漢字 FROM MASTER_TANTO INNER JOIN 
 TBLKAIIN ON MASTER_TANTO.担当者コード = '" 120729 "' の構文エラー:
演算子がありません。」

【SQL】
Update TBLKAIIN Set TBLKAIIN.架電中サイン = 1,TBLKAIIN.最終アクセス担当者 = MASTER_TANTO.担当者名_漢字 
FROM MASTER_TANTO INNER JOIN TBLKAIIN ON MASTER_TANTO.担当者コード = '" + username + "' 
WHERE TBLKAIIN.カード番号 = '" & txtカード番号(0).Text & "'

【テーブル構造】

TBLKAIIN・・・カード番号、氏名_漢字、架電中サイン、最終アクセス担当者
MASTER_TANTO・・・担当者コード、担当者名_漢字、部署コード

【変数】
username・・・string型  標準モジュールにPublicにて宣言
              当アプリケーション起動時に表示されるログインフォームにて入力されたIDが
              MASTER_TANTOの担当者コードと一致した場合、格納される。

【行いたいこと】
TBLKAIINと連結したFORMにて顧客情報を表示させている。
(FORM上のtxtカード番号(0).TextにはTBLKAIINのカード番号が表示)                        
あるアクションにて、その時txtカード番号(0).Textに表示されているカード番号の
レコードに架電中サイン、最終アクセス担当者をUPDATEしたい。
架電中サイン・・・1をSET
最終アクセス担当者・・・MASTER_TANTOテーブルを参照しusernameと一致する担当者名_漢字をSET

Set TBLKAIIN.架電中サイン = 1,TBLKAIIN.最終アクセス担当者 = '" + username + "'とすれば
最終アクセス担当者欄にちゃんとIDが格納されてます。
それからさらに担当者名_漢字を導き出すようにするとうまくいきません。

演算子がないというエラー内容ですが、どこに必要なのでしょうか。
申し訳ございませんが、どうかお助けください。


魔界の仮面弁士  2004-01-13 22:10:05  No: 111090

エラーメッセージに、
『TBLKAIIN ON MASTER_TANTO.担当者コード = '" 120729 "' の構文エラー:』
と書かれているならば、SQLを作成している部分に問題があるのかも知れません。

『MASTER_TANTO.担当者コード = '" 120729 "'』ではなく、
『MASTER_TANTO.担当者コード = '120729'』になるようにしてみてください。

ただしDB上の「担当者コード」列が、文字列ではなく、数値型の場合は、
『MASTER_TANTO.担当者コード = 120729』となるようにします。

それと、SQLを生成する再には、
  SQL = "SELECT UserName FROM LOGIN WHERE ID='" & Text1.Text & "'"
のようなコーディングはNGとされていますので、ご注意ください。

# 例えば、上記のText1.Textに、『' OR ''='』と入力されてしまうと、
# 検索条件が 『WHERE ID='' OR ''=''』になってしまいますよね。


魔界の仮面弁士  2004-01-13 22:23:16  No: 111091

# VBネタというより、DBネタっぽいなぁ…。

ところで、使用しているDBはなんですか?

例えば、
  UPDATE titles
     SET ytd_sales = t.ytd_sales + s.qty
    FROM titles t, sales s
    WHERE t.title_id = s.title_id
とか
  UPDATE titles
     SET ytd_sales = t.ytd_sales + s.qty
    FROM titles t INNER JOIN sales s
      ON t.title_id = s.title_id
などといったUPDATE SQLは、SQL Server 2000では実行できますが、
他のデータベース(例えばJet 4.0とかOracle 8.0.6等)では、
実行できない可能性がありますので。


特攻隊長まるるう  2004-01-13 23:32:43  No: 111092

SQLサーバー2000で軽く確認しただけだと問題なかったんですが、
Accessでは内部結合式のエラーとなりました。原因などについて
全て調べる時間がありませんのでエラーの見つけ方を載せます。

・以前ご紹介したSQL文で『演算子がありません』というエラーを
確認いたしました(Access2002(SP2))
・まずSQL文が複雑な時には分解します。特に意図したテーブルが
取れてきてるかを確認しなければなりません。
・最初に実行したクエリ
SELECT * 
       FROM MASTER_TANTO INNER JOIN TBLKAIIN
           ON MASTER_TANTO.担当者コード = '1234'
実行時エラーメッセージ『結合式がサポートされていません』
Accessヘルプより抜粋『SQL ステートメントに複数の結合があり、
その実行順序によってクエリの結果が異なる可能性があります。
最初の結合を実行するクエリを別に作成し、そのクエリを SQL 
ステートメントに追加してください。 
JOIN 操作の ON ステートメントが不完全であるか、または指定
したテーブルが多すぎます。WHERE 句で ON 式を使用してください。』

・色々やってうまくテーブルを生成できるクエリ
SELECT * 
       FROM MASTER_TANTO INNER JOIN TBLKAIIN
           ON MASTER_TANTO.担当者コード = TBLKAIIN.カード番号

…一番簡単で解決しそうな方法は[担当者コード]と[カード番号]を
同じにすること。
違う場合は[担当者コード]と[カード番号]の別テーブル(NUMBERS)を
作って
SELECT * 
       FROM TBLKAIIN INNER JOIN NUMBERS
           ON TBLKAIIN.カード番号 = NUMBERS.カード番号
と取ってきたものを更に内部結合する…。

つまり
SELECT * 
FROM
    (SELECT *
    FROM TBLKAIIN INNER JOIN NUMBERS ON NUMBERS.カード番号 = TBLKAIIN.カード番号) as t
INNER JOIN MASTER_TANTO
ON t.担当者コード = MASTER_TANTO.担当者コード

…テーブルの構成変えて良いんならMASTER_TANTO.カード番号を作った方が
見た目には簡単ですが…この辺りでもう少しご検討ください。


特攻隊長まるるう  2004-01-14 00:53:26  No: 111093

上のじゃ分かり難いかなぁ?。結局『内部結合』する
のに2つのテーブルの関係性を示さないといけないっぽい?
(↑ボクはSQL Server 2000使用者ですのであくまで予想)

だから結合するテーブルから抽出条件を決めてやれば
『演算子がありません』のエラーは回避できそう。
ってのが1つ。

でも何の関連も無い時は困るよなぁ…不恰好なんだけど
SELECT * 
FROM
    (SELECT -1 as [Dummy], 氏名_漢字
    FROM TBLKAIIN 
    WHERE カード番号 = 111) as t
INNER JOIN MASTER_TANTO
ON t.Dummy <> MASTER_TANTO.担当者コード        <---絶対に等しくならない条件を置く
…ならできなくはないが…うむむむむぅ。
もっとデータベース関連の掲示板で聞いた方が
良いかも?。細かな仕様の情報まで知らないですから。
…とりあえずボクができるのはココまで。


特攻隊長まるるう  2004-01-15 02:15:09  No: 111094

結局。UPDATE で FROM 句自体が使えないというところまで
いっちゃいました(T▽T)

↓これは当然通る
UPDATE TBLKAIIN
SET TBLKAIIN.架電中サイン = 1

↓これですでに通らない
UPDATE TBLKAIIN
SET TBLKAIIN.架電中サイン = 1
FROM TBLKAIIN

↓こんなのは通りそう
UPDATE TBLKAIIN
SET TBLKAIIN.架電中サイン = 1
WHERE カード番号 IN
   (SELECT 担当者コード
   FROM MASTER_TANTO
   WHERE 担当者コード = 1234)

…結論。1つにまとめられないんじゃないだろうか??。
そんな情報お持ちの方を待ちましょう…m(__)m


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加