UPDATE テーブル名 SET・・・FROM またテーブル名
いつもお世話になっております。
SQL文の UPDATE ではテーブル名(以下だとD_売上明細)を2回書きますが
そういうものなのでしょうか? 1つにはできないのでしょうか。
UPDATE D_売上明細
SET 商品CD = 12
FROM D_売上明細
WHERE 商品CD = 123
こういった質問サイトもあるのですね。利用したいと思います。
https://teratail.com/tags/SQL
-
ところでここで自分の名前をクリックして、投稿を押すと
過去の投稿一覧が表示されて、見直すにも便利ですね。 -
nkmtさま
update
A
set
商品CD=12
from
D_売上明細 A
where
商品CD=123というふうに書けますよ。
-
updateの直後はエイリアスを書けるのですね。ありがとうございます。
(ただいま、他県でPC入れ替え中です。Liveメール → Outlook変換中。こけるので小分けして変換中。) -
nkmtさま
お忙しいところ返信いただきありがとうございます。
質問に対する回答ではありませんでしたね。
joinする必要がなければ、1つだけ書けばよいですが(下記のように)
update
D_売上明細
set
商品CD=12
where
商品CD=123テーブルを2つ以上参照する場合はできないです。
-
こんにちはPuです。
普通1つでしょう
update テーブル名
set 列名1 = xxxxx
,列名2 = nnnnn
where 列名xx = 'hogehoge
でわ~でわ~' -
コメントありがとうございます。パソコン触れる時に試してみます。
-
shinpei様、Puさん 誠にありがとうございました。
▼JOINが不要な場合、UPDATEの後ろに更新テーブル名を記述し、FROM は無くて良い。
update D_売上明細
set 商品CD=12
where 商品CD=123 で良い
▼JOINが必要な場合、UPDATEの後ろは更新対象テーブルのエイリアス名でも良い。
update UM
set 商品CD=12
FROM D_売上明細 UM
LEFT JOIN M_XXX XX ON XX.xxxCD = UM.xxxCD
where UM.商品CD=123
で良さそうですね。理解しました。感謝です。 -
今日は以下のデータパッチを行いました。本物のテーブル名ではありません。
UPDATE MD
SET [棚番号大]= ISNULL(TB.棚番号大,0)
,[棚番号中]= ISNULL(TB.棚番号中,0)
,[棚番号小]= ISNULL(TB.棚番号小,0)
FROM DATA_iPad棚卸 MD
LEFT JOIN MST棚番 TB ON TB.拠点コード=2 AND TB.商品CD = MD.商品CD
※このシステムでは棚番は3階層ですが少ない方でしょうね。
棚番の入れ替え等効率よく出来るシステムが求められますね。
今登録されている棚番全部消してください!と頼まれた事があります。
悲しい...と担当者様言ってました。
今だったら、何番~何番を+100しましょうか!と提案も可能かもしれません。 -
昨日の夜はSQLコンテストというのに参加してみました。
いろんな方々の回答例が見られて勉強になりました。
SQLiteでは LEFT JOIN 得意先マスタ USING(得意先CD)といった記述で結び付けが可能みたいですね。
JOINの USING は初めて知りました。
この場合、DB上の項目名にはテーブル名を表す言葉は付加しない方が便利そうだと思いました。
でもSQL Serverではおそらく使えないので ON句でJOINしております。 -
厚かましく質問です。
▼普段使ってません。
SELECT 伝票番号 , 営業担当者コード , 担当者名 FROM DATA売上伝票 , MST担当者
WHERE 営業担当者コード=担当者コード AND 売上日>=20190101
▼以下のようなJOINをよく使います。
SELECT 伝票番号 , 営業担当者コード , 担当者名 FROM DATA売上伝票
LEFT JOIN MST担当者 ON 担当者コード = 営業担当者コード
WHERE 売上日>=20190101
推定実行プランの表示とやりますと表示される関連図やコスト%も同じ値でした。
つまりどっちでも速度は一緒という事でしょうか? -
内部結合と左外部結合の差があるので結果が異なるかと思いますが・・・
内部結合はWHERE句で合致したレコードのみが抽出される。
左外部結合は左のテーブルの全件が抽出される。
右テーブルの内容は合致したレコードのみ設定される。
今回の例ですと、MST担当者に存在しないレコードが抽出されるされないの差が出ます。
-
whereの方は内部結合インナージョインと同等なんですね。失礼しました。レスありがとうございました。
-
参考までですが、MagicですとInner Joinが「I=結合リンク」で、Outer Joinが「O=外部リンク」になります。
-
tandaさん、ありがとうございます。
その点は承知しております。
伝票入力画面でコードを入力したらマスタ名称を取得するシーンでは照会リンクを使う事が多いです。結合リンクはあまり使いませんが絞りこみなどで使う場面では外部リンクを使ってます。
今初めて気付きましたがリンクの選択記号はインナーのiと
アウターのoなんですね。dはDefineですかね?
Magic開発版の日本語版を英語モードで動かす事って出来ましたかね?
昔は海外のβ版Magicを入手してインストールする事もありましたが、最近はそれもできないですね。
xpa5っていつか出るのでしょうね。
-
「O=外部リンク」は、SQLが持つオリジナルの機能をMagicが裏でコールしているだけです。表向きの動きとしては、「L=照会リンク」と同じになります。「L=照会リンク」はISAM互換として残っているようなものですね。
-
とはいえ、やはりまだまだPervasiveのユーザさんは多いと思いますので、主流は「L=照会リンク」ですね。
-
外部リンクと照会リンクはselectの発行回数は違うという事でよろしいでしょうか?
ところで画面で変数入力した値でマスタ名称などを表示する部分は照会リンクしか使ったことがありませんが外部リンクを定義したらエラーになりますかね?
後で面白半分で試してみます。 -
メインソースに対して沢山のマスタからマスタ名称を参照するマスタを
照会リンクにするのと外部リンクにするのではSELECTの発行回数は違ってきますよね。 -
変数はMagicが管理している値でして、リンクに使用される項目はSQLが管理している値ですので、おかしなことをすると、おかしな動きになりそうな気がしますね。
-
Magicが裏でどのようなSQLコマンドを送っているかは、MagicでSQLのログを取ってみると分かりますよ。
-
そういえば思い出しましたが、「照会リンク」を使用した場合は「結合リンク」や「外部リンク」と違って、データをMagicのローカルキャッシュ上に落としてからリンク処理を行いますので、送信されるSQL文も複数に渡る場合もあったような記憶があります。これはPervasiveとの互換処理ですから、当然のことになりますが。
サインインしてコメントを残してください。
コメント
21件のコメント