12

SQLite バージョン 3.7.12.1 (コンソール) では、このクエリは機能しません。

(SELECT * FROM A
UNION
SELECT * FROM B)
EXCEPT
(SELECT * FROM A
INTERSECT
SELECT * FROM B);

エラーメッセージ

エラー: 行 1 付近: "(" 付近: 構文エラー

このクエリは、SQL Server Management Studio で機能します。ブラケットを使用したその他のクエリは、期待どおりに機能します。何か不足していますか?

編集:明確にするために:

SELECT * FROM A;     <-- works
(SELECT * FROM A);   <-- does not work [Error: near line 1: near "(": syntax error]
SELECT * FROM A WHERE A.id IN (SELECT B.id FROM B);   <-- works, so no fundamental issues with brackets and sqlite...
4

2 に答える 2

11

SQLite は、結合された (サブ) クエリ ( UNIONUNION ALLEXCEPTまたはを含むものINTERSECT) を括弧で囲むことを好まないようです。

  • これは機能しません:

    (SELECT 1 AS v
    UNION
    SELECT 2)
    EXCEPT
    SELECT 1
    
  • これも機能しません:

    SELECT 1 AS v
    UNION
    (SELECT 2
    EXCEPT
    SELECT 1)
    

(ただし、どちらも SQL Server で動作します。)

また、括弧を使用しないと、個々の副選択が順次結合されます。つまり、他の SQL 製品のように、どの演算子にも固有の優先順位はありません。(例えば、これ

SELECT 1 AS v
UNION
SELECT 2
INTERSECT
SELECT 3

1SQL Server で返さINTERSECTれ (最初に実行されるため) 、SQLite では何も返されません)。

唯一の回避策は、次のように、組み合わせたい部分をサブクエリとして使用することです。

SELECT *
FROM (
  SELECT * FROM A
  UNION
  SELECT * FROM B
)
EXCEPT
SELECT *
FROM (
  SELECT * FROM A
  INTERSECT
  SELECT * FROM B
)
于 2012-05-31T07:06:17.340 に答える
0
((SELECT * FROM A)
UNION
(SELECT * FROM B))
EXCEPT
((SELECT * FROM A)
INTERSECT
(SELECT * FROM B));
于 2012-05-30T10:44:11.853 に答える