使用IN和子选择的SQLite奇怪响应

2uluyalo  于 2023-02-16  发布在  SQLite
关注(0)|答案(1)|浏览(118)
CREATE TABLE minitable (uid INTEGER primary key);

insert into minitable values (1);
insert into minitable values (2);
insert into minitable values (3);
insert into minitable values (4);
insert into minitable values (5);
insert into minitable values (6);

select uid
from minitable as gp
 where
  uid in (
    (select uid from minitable)
  );

SQLite只给出一行作为结果,我期望SQLite像其他数据库引擎一样给出所有6个值,MariaDB,PostgreSQL和其他一些DBMS给出从1到6的所有值作为结果。
有了这个

select uid
from minitable as gp
 where
  uid in (
    1,2,3,4,5,6
  );

SQLite(如MariaDB和PostgreSQL)返回所有值。
我使用SQLite 3.40.1、3.21和3.37进行了测试。

4sup72z8

4sup72z81#

从SQL语言表达式/子查询表达式(重点是我的):
括在括号中的SELECT语句是子查询。所有类型的SELECT语句,包括聚集和复合SELECT查询(带有UNION或EXCEPT等关键字的查询)都允许用作标量子查询。子查询表达式的值是括在括号中的SELECT语句的****结果的第一行....
在代码中,将select uid from minitable括在圆括号内,然后再将其括在运算符IN列表的圆括号内。
这样,子查询被解释为运算符IN列表的单个元素,并且由于SQLite将子查询视为单个值(结果集的第一行,即仅包含值为1的列uid的行),因此完整查询等效于:

select uid
from minitable as gp
where uid in (1);

对于SQLite,如果删除子查询两边的圆括号,只保留运算符IN列表中的子查询,则可以实现所需的行为:

select uid
from minitable as gp
where uid in (select uid from minitable);

相关问题