質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
86.02%
MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

JDBC

JDBC(Java DataBase Connectivity)は、Javaとリーレーショナルデータベースに接続させる基本的なAPIです。Java上でSQLステートメントを発行することで、データベースの種類に影響を受ないDB操作を可能とします。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Q&A

受付中

SQL 文法エラー 理由が分からない

koko122102
koko122102

総合スコア37

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

JDBC

JDBC(Java DataBase Connectivity)は、Javaとリーレーショナルデータベースに接続させる基本的なAPIです。Java上でSQLステートメントを発行することで、データベースの種類に影響を受ないDB操作を可能とします。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

1回答

0グッド

1クリップ

363閲覧

投稿2022/12/04 08:56

編集2022/12/05 06:49

前提

javaとmysqlを使って勤怠管理及び社員の情報を格納するシステムを作っています。
社員の情報を削除するプログラムを作成したのですがエラーが出ました。
しかし、WHERE文以外全く同じSQL文をA5:SQL mk-2 に入力したところ動きました。

実現したいこと

・文法エラーを訂正しプログラムが動くようにしたい。

発生している問題・エラーメッセージ

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'INNER JOIN employee_pass b ON a.id = b.id LEFT OUTER JOIN employee_career c ' at line 1

該当のソースコード

java

1 2public void doDelete(int id) { 3 4 try { 5 Class.forName(DRIVER_NAME); 6 }catch(ClassNotFoundException e) { 7 e.printStackTrace(); 8 } 9 10 Connection con = null; 11 PreparedStatement ps = null; 12 boolean flg = true; 13 14 try { 15 16 con = DriverManager.getConnection(JDBC_URL,USER_ID,USER_PASS); 17 con.setAutoCommit(false); 18 19 StringBuffer buf = new StringBuffer(); 20 21 buf.append(" DELETE"); 22 buf.append(" FROM "); 23 buf.append(" employee_info a "); 24 buf.append(" INNER JOIN employee_pass b ON "); 25 buf.append(" a.id = b.id "); 26 buf.append(" LEFT OUTER JOIN "); 27 buf.append(" employee_career c ON a.id = c.id "); 28 buf.append(" INNER JOIN "); 29 buf.append(" division d ON c.division_id = d.id "); 30 buf.append(" INNER JOIN "); 31 buf.append(" branch e ON c.branch_id = e.id "); 32 buf.append(" WHERE "); 33 buf.append(" a.id = ? "); 34 35 36 ps = con.prepareStatement(buf.toString()); 37 ps.setInt(1, id); 38 39 40 41 ps.executeUpdate(); 42 System.out.println("削除成功"); 43 44 45 }catch(SQLException e) { 46 e.printStackTrace(); 47 flg = false; 48 System.out.println("削除失敗"); 49 }finally{ 50 51 if (ps != null) { //接続が確認できている場合のみ実施 52 try { 53 ps.close(); //接続の解除 54 } catch (SQLException e) { 55 e.printStackTrace(); 56 } 57 } 58 59 //Connectionオブジェクトの接続解除 60 if (con != null) { //接続が確認できている場合のみ実施 61 try { 62 con.close(); //接続の解除 63 } catch (SQLException e) { 64 e.printStackTrace(); 65 } 66 } 67 } 68 69 } 70

以下が使用テーブルの概要です

SQL

1CREATE TABLE EMPLOYEE_INFO( 2 ID INT AUTO_INCREMENT NOT NULL PRIMARY KEY COMMENT "ID", 3 NAME VARCHAR(10) NOT NULL COMMENT "名前", 4 AGE INT NOT NULL COMMENT "年齢", 5 BIRTH DATE NOT NULL COMMENT "生年月日", 6 GENDER INT NOT NULL COMMENT "性別" 7 8 9); 10 11CREATE TABLE EMPLOYEE_CAREER( 12 ID INT NOT NULL PRIMARY KEY, 13 STARTING_DATE DATE NOT NULL COMMENT "入社日", 14 DIVISION_ID INT NOT NULL COMMENT "所属部署", 15 RETIRERING_DATE DATE COMMENT "退社日", 16 BRANCH_ID INT NOT NULL COMMENT "所属支店" 17); 18 19CREATE TABLE DIVISION( 20 21 ID INT NOT NULL PRIMARY KEY, 22 DIVISION_NAME VARCHAR(10) NOT NULL COMMENT "部署" 23 24); 25 26CREATE TABLE BRANCH( 27 28 ID INT NOT NULL PRIMARY KEY, 29 BRANCH_NAME VARCHAR(10) NOT NULL COMMENT "支店" 30 31); 32 33CREATE TABLE EMPLOYEE_PASS( 34 ID INT NOT NULL PRIMARY KEY, 35 PASSWORD VARCHAR(30) NOT NULL COMMENT "パスワード"); 36 37INSERT INTO EMPLOYEE_INFO( 38 NAME, AGE, BIRTH, GENDER 39 )VALUES( 40 "MONA", 25, "1997-05-12", 2 41 ) 42 43INSERT INTO EMPLOYEE_CAREER( 44 ID, STARTING_DATE, DIVISION_ID, BRANCH_ID 45 )VALUES( 46 1, "2020-11-04", 1, 3 47 );

試したこと

・引数のidに数値がちゃんと入力されているかを確認。
・テーブル名などのタイポを確認。

補足情報(FW/ツールのバージョンなど)

eclipse Version: 2021-12 (4.22.0)
MySQL Ver 8.0.29 for Win64 on x86_64 (MySQL Community Server - GPL)

以下のような質問にはグッドを送りましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

グッドが多くついた質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

気になる質問をクリップする

クリップした質問は、後からいつでもマイページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

下記のような質問は推奨されていません。

  • 間違っている
  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

yuma.inaura

2022/12/04 09:00

具体的にどんなSQLが発行されているんでしょう? SQL全体を書いてほしいです
Orlofsky

2022/12/04 11:14

質問は修正できます。 SQLで使っているテーブルのCREATE TABLE文と各テーブルのデータを何件かINSERT文で追記してください。 DELETE文の書き方を参考にしたURLも提示すると良いかと。
dameo

2022/12/04 12:55

あ、よく読んだら複数テーブルの話が書いてありましたね。 create table A(value int); create table B(value int); delete A, B from A inner join B on A.value=B.value; こんな感じで対象テーブルをfromの前に並べるみたいです。
koko122102

2022/12/05 06:47

みなさまご丁寧に返信していただき誠にありがとうございます。 こちらDELETE の後に削除するテーブルのエイリアスを付けたところエラーは無くなりました。 ただ、対象テーブルの情報は削除されない状況に陥りました。A5:SQL mk-2 に同じ分を入れたら作動しテーブルから情報が消されました。 重ね重ねで恐れ入りますが、原因と改善策をご教示いただけないでしょうか。
dameo

2022/12/05 06:57

commitしてないからでは?

回答1

0

結合してdelete する場合、delete対象テーブルはエイリアスで指定するのですよね。
なので、少なくとも以下のようになるのではないでしょうか。

DELETE a
FROM
employee_info a
・・・あとは続く

投稿2022/12/04 15:05

sooni

総合スコア51

良いと思った回答にはグッドを送りましょう。
グッドが多くついた回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。

下記のような回答は推奨されていません。

  • 間違っている回答
  • 質問の回答になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

このような回答には修正を依頼しましょう。

回答へのコメント

dameo

2022/12/04 23:45

補足です。 alias指定である必要はないですが、aliasを宣言できるのはfrom句の後だけで、FROM句の前はaliasの指定が可能、という話のようです。再掲しておきます。 https://dev.mysql.com/doc/refman/8.0/en/delete.html ※SQL標準ではなく、MySQL/MariaDBの独自文法です

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
86.02%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問

同じタグがついた質問を見る

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

JDBC

JDBC(Java DataBase Connectivity)は、Javaとリーレーショナルデータベースに接続させる基本的なAPIです。Java上でSQLステートメントを発行することで、データベースの種類に影響を受ないDB操作を可能とします。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。