与sqlite中的子查询结果进行比较

时间:2015-06-24 16:05:21

标签: sql sqlite

以下是代码:

SELECT * FROM COMPANY WHERE SALARY > 40000;


4   Mark    25  Rich-Mond   65000.0
5   David   27  Texas       85000.0
6   Kim     22  South-Hall  45000.0
8   Kitos   31              90000.0

SELECT * FROM COMPANY 
        WHERE AGE < (SELECT AGE FROM COMPANY WHERE SALARY > 40000);

3   Teddy   23  Norway      20000.0
6   Kim     22  South-Hall  45000.0
7   James   24  Houston     10000.0

当子查询返回多行时,这是如何工作的?在这个例子中,我希望最后一个查询生成22岁以下的员工(从子查询中最少),显然它不会那样工作。

1 个答案:

答案 0 :(得分:1)

如果子查询没有返回一个结果,则大多数数据库都会引发错误。 SQLite没有,但只使用第一个返回的行(或NULL)(有一个隐含的LIMIT 1)。 如果没有ORDER BY,则无法保证SELECT结果的顺序,因此结果将是随机的。

如果您想使用某些特定的记录,您必须确保SELECT完全返回该记录,通常使用MIN / MAX或ORDER BY:

SELECT ...
FROM Company
WHERE Age < (SELECT MIN(Age)
             FROM Company
             WHERE Salary > 40000);

SELECT ...
FROM Company
WHERE Age < (SELECT Age
             FROM Company
             WHERE Salary > 40000
             ORDER BY Age
             LIMIT 1);

也可以使用correlated subquery,它可以为外部查询中的每一行返回不同的结果:

SELECT ...
FROM Company
WHERE Age < (SELECT Age
             FROM Company AS C2
             WHERE C2.ID = Company.ManagerID);