在 SQLite 3 中的 WITH RECURSIVE 之前使用 EXCEPT

0 sqlite except

有没有办法做到这一点?我正在尝试做这样的事情:

SELECT x
FROM table
EXCEPT
WITH RECURSIVE ...();
Run Code Online (Sandbox Code Playgroud)

ype*_*eᵀᴹ 5

WITH查询中的第一个去。你可以使用这个:

WITH RECURSIVE ct AS (...)
SELECT x
FROM table
EXCEPT
SELECT y
FROM ct ;
Run Code Online (Sandbox Code Playgroud)

作为记录,CTE 可以(在标准 SQL 中)在子查询中,但没有多少 DBMS 实现了这种语法:

SELECT x
FROM table
EXCEPT
SELECT y
FROM 
  ( WITH RECURSIVE ct AS (...)
    SELECT y
    FROM ct 
  ) AS c ;
Run Code Online (Sandbox Code Playgroud)

或者这个更简单的:

SELECT x
FROM table
EXCEPT
( WITH RECURSIVE ct AS (...)
  SELECT y
  FROM ct 
) ;
Run Code Online (Sandbox Code Playgroud)

  • @CL。:这些例子都没有使用“子查询”。这些是派生表 - 这与子查询不同。最重要的是,派生表可以在任何可以使用常规表的地方使用。根据 SQL 标准,所有三个查询都是完全有效的(如果我没记错的话,除了缺少派生表的别名) (2认同)
  • @CL 略读 SQL-99 标准(旧的,但仍然相关),非连接查询表达式(定义 UNION/EXCEPT)可以包含带括号的查询作为任一操作数:非连接查询表达式可以由非连接查询主要组成包含 *left-paren 非连接查询表达式 right-paren* 然后通过非连接查询词从非连接查询表达式返回到查询规范。对我来说看起来像是有效的标准 SQL(更不用说它在许多引擎中运行良好,这可能是一个更有用的标准;) (2认同)