MINUS
を使用しようとすると、「SQL構文にエラーがあります…」などの恐ろしいエラー1064(42000)が発生する可能性がある理由が少なくともいくつか考えられます。 MariaDBの演算子。
以下でこれらを調べ、いくつかの解決策を提供します。
エラーの原因となるコードの例を次に示します。
SELECT TeacherName FROM Teachers
MINUS
SELECT StudentName FROM Students;
結果:
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'SELECT StudentName FROM Students' at line 3
通常、このエラーは、コードにエラーがある場合に生成されます。 「SQL構文にエラーがあります」と明示的に記載されているため。
ただし、これはここでのいくつかの可能性の1つにすぎません。
私の場合、構文にエラーはありません。別の理由が必要です。
以下は、このエラーの考えられる理由と、それぞれを修正する方法の提案です。
まず、MINUS
演算子はMariaDB10.6.1で導入されました。したがって、以前のバージョンのMariaDBを実行している場合は、MINUS
オペレーターはあなたのために働きません。
この場合、MariaDBインストールを最新バージョン(または少なくとも10.6.1より前のバージョン)にアップグレードしてください。
次に、MINUS
演算子はOracleモードでのみ機能します。これはMariaDBのドキュメントでは明示的に言及されていませんが、MINUS
を実装するためのタスクで暗示されています MariaDBの演算子。
すでにMariaDB10.6.1以降を実行している場合は、MINUS
を使用する前にOracleモードに切り替える必要があります。 オペレーター。
したがって、MINUS
の使用を開始する前に、次のコードを実行してください 演算子:
SET sql_mode = "oracle";
これで、MINUS
を使用できるようになります。 コード内の演算子。
上記のすべてを実行してもエラーが発生する場合は、実際にある可能性があります。 構文にエラーがあります。
たとえば、MariaDB 10.6.1をOracleモードで実行していますが、次のコードでエラーが発生します。
SELECT TeacherName FROM Teachers;
MINUS
SELECT StudentName FROM Students;
結果:
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'MINUSの近くで使用する正しい構文については、MariaDBサーバーのバージョンに対応するマニュアルを確認してください。
この場合、最初のSELECT
の後に誤ってセミコロンを含めました よくある間違いです。これを修正するには、最初のセミコロンを削除します:
SELECT TeacherName FROM Teachers
MINUS
SELECT StudentName FROM Students;
結果:
+-------------+ | TeacherName | +-------------+ | Ben | | Cathy | +-------------+
成功!
上記のすべての解決策を試してもエラーが発生する場合は、EXCEPT
を使用する必要があります。 オペレーター。 MINUS
演算子はEXCEPT
の同義語です 、したがって、どちらも同じ構文を使用し、同じ結果を返します。
SELECT TeacherName FROM Teachers
EXCEPT
SELECT StudentName FROM Students;
結果:
+-------------+ | TeacherName | +-------------+ | Ben | | Cathy | +-------------+
今までにMINUS
とは何の関係も望まない場合 またはEXCEPT
、別のオプションがあります。
次のようなサブクエリを使用して、同じ結果を返すことができます。
SELECT
DISTINCT TeacherName
FROM Teachers t
WHERE NOT EXISTS (SELECT StudentName FROM Students s
WHERE t.TeacherName = s.StudentName);
明らかに、使用する正確なクエリはスキーマとデータによって異なります。