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进行了测试。
1条答案
按热度按时间4sup72z81#
从SQL语言表达式/子查询表达式(重点是我的):
括在括号中的SELECT语句是子查询。所有类型的SELECT语句,包括聚集和复合SELECT查询(带有UNION或EXCEPT等关键字的查询)都允许用作标量子查询。子查询表达式的值是括在括号中的SELECT语句的****结果的第一行....
在代码中,将
select uid from minitable
括在圆括号内,然后再将其括在运算符IN
列表的圆括号内。这样,子查询被解释为运算符
IN
列表的单个元素,并且由于SQLite将子查询视为单个值(结果集的第一行,即仅包含值为1
的列uid
的行),因此完整查询等效于:对于SQLite,如果删除子查询两边的圆括号,只保留运算符
IN
列表中的子查询,则可以实现所需的行为: