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 & "'"
> TBLKAIIN.最終アクセス担当者 = '" + srt + "' WHERE
この部分を
WHERE TBLKAIIN.最終アクセス担当者 IN (" + srt + ") AND
にしたらどうでしょうか?
それと、これはVBではなくSQLの質問だと思うので
そっち関連の掲示板が適切かもしれません。
z 様
ご回答いただきありがとうございます。
こちらの説明不足ですが、SELECTで取得した値を
UPDATE文でSETしたいのでWHERE以降に記述しては
SETされなくなります。
確かにSQLの質問でこの場にはふさわしくないのですが
なんとか引き続きお願いできないでしょうか。
すみません、いまいちよくわかりません。
1)MASTER_TANTO、TBLKAIINの構造とusername、txtカード番号(0)
との関係性がよくわかりません。
2)また、UPDATE文でどのような処理をしたいのかもわかりません。
とりあえず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 '
特攻隊長まるるう 様
丁寧にお教えいただきましてありがとうございました。
>> TBLKAIIN.最終アクセス担当者 = '" + srt + "' WHERE
> がなぜダメなのかは理解できてますよね?これでは
>TBLKAIIN.最終アクセス担当者が文字列『SELECT MASTER_TANTO.担当者名_漢字>From MASTER_TANTO WHERE MASTER_TANTO.担当者コード = '" + username >+ "'』
>そのものと一致するという条件になってしまいます。
大変よくわかりました。
私はSQLの式の文字そのものを代入していただけなんですね。
ほんとなんと言っていいやら。。。
>あくまで利用する全ての情報を持った(できれば最小の)テーブルを
>用意し、それから内部のデータを操作する意識を持っておいた
>方が良いでしょう。
よくわかりました。(大変勉強になります。)
がんばってTRYしているのですが、今
クエリ式 構文エラー 演算子がありません
というエラーに悩まされています。
もう少しがんばります。
お世話になっております。ももたろうです。
あれから試行錯誤していたのですが、どうもエラーになってしまいます。
何度も申し訳ございませんが、お助けいただけないでしょうか。
【エラー内容】
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が格納されてます。
それからさらに担当者名_漢字を導き出すようにするとうまくいきません。
演算子がないというエラー内容ですが、どこに必要なのでしょうか。
申し訳ございませんが、どうかお助けください。
エラーメッセージに、
『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 ''=''』になってしまいますよね。
# 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等)では、
実行できない可能性がありますので。
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.カード番号を作った方が
見た目には簡単ですが…この辺りでもう少しご検討ください。
上のじゃ分かり難いかなぁ?。結局『内部結合』する
のに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.担当者コード <---絶対に等しくならない条件を置く
…ならできなくはないが…うむむむむぅ。
もっとデータベース関連の掲示板で聞いた方が
良いかも?。細かな仕様の情報まで知らないですから。
…とりあえずボクができるのはココまで。
結局。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
ツイート | ![]() |