简体   繁体   中英

Comparison with results from sub-query in sqlite

Here is the code:

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

How does this work when there are multiple row returned from the sub-query? In this example I would expect the last query to produce employees younger than 22 (minimum from the sub-query), apparently it doesn't work that way.

Most databases will raise an error if the subquery does not return exactly one result. SQLite doesn't, but just uses the first returned row (or NULL) (there is an implied LIMIT 1 ). The order of SELECT results is not guaranteed without an ORDER BY, so the result will be random.

If you want to use some specific record, you must ensure that you SELECT returns exactly that record, typically using MIN/MAX, or with 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);

It is also possible to use a correlated subquery , which can return a different result for each row in the outer query:

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM