質問: '1234' at line 2 SELECTはできます。 構文エラーってでてますが見つけられず、、、 どこがおかしいのでしょうか?
回答: なかなか突っ込みどころ満載ですね・・・。 先ず構文エラーの原因ですが、 他の回答者様のご指摘どおり**LEFT JOIN句**の指定箇所が誤っているためです。 SET句とLEFT JOIN句を入れ替えればとりあえず動作はするクエリにはなるでしょう。 ちなみにSQLの他テーブルを結合するUPDATE句は、 DBMS(ベンダ)ごとに構文が異なっているため、 念のため書き方に誤りがないかマニュアルを確認するようにした方が良いでしょう。 ただそもそも論として上記のクエリだと、 LEFT JOINを利用する意味がありません。 質問者様のSQLを軽くコメントにて指摘してみます。 ``` UPDATE `table1` /* * table2のレコードで更新対象を絞り込む目的なら「INNER JOIN」で良いのでは? */ LEFT JOIN `table2` ON `table1`.`ID` = `table2`.`ID` SET `table1`.`IMPORT_FLG` = 1 WHERE `table1`.`ID` = '123456789' /* * 以下のように抽出条件で条件を指定するとtable2.SHOP_CD='000000000'のもの抽出結果が限定される。 * つまりやってることは「INNER JOIN」と変わらない。 * 「LEFT JOIN」の振る舞いを残すのであれば下記条件は結合条件に移動する必要がある。 */ AND `table2`.`SHOP_CD` = '000000000' ``` **結合方法、結合条件、抽出条件**これらの組み合わせに応じた振るまいの違いは、 なんとなくレベルではなくしっかり抑えることをおすすめします。 またUPDATE句では**全レコードが洗い替えられたり1件も更新されない**ことはあっても、 レコードが消失することは先ずありえません。 **UPDATE句やDELETE句**を作成する前に、 同一条件となるSELECT句を流してみて、 想定通りのデータが抽出されるか確認する習慣をつけると良いでしょう。 今回だと以下のようなSELECT句を流すことで検証できます。 ``` SELECT `table1`.* FROM `table1` LEFT JOIN `table2` ON `table1`.`ID` = `table2`.`ID` WHERE `table1`.`ID` = '123456789' AND `table2`.`SHOP_CD` = '000000000' ``` 上記クエリでで取得されるデータがあれば、 そのままその取得データがUPDATE句の更新対象レコードとなります。 上記で取得レコードがなければ、 更新対象は0件となり更新自体が行われていないことになります。 SQLに限らずですが段階を追って製造を進めることで、 下手にはまる自体を避けることが出来るので、 日ごろからある程度意識すると良いかもしれません。 追記 == レコードが取得できない云々は、 抽出条件とかフィルタリング条件が悪さしてそうなので、 単純に`SELECT * FROM table1`を実行にてレコードは取れませんか? 上記でレコードが取得されなければ、 恐らく今回のUPDATE操作以外の所が原因でレコードが消えていると思われます。