2015-10-01 1 views
0

Я не понимаю логику запроса 3, как показано ниже, и надеюсь, что кто-то может дать мне некоторую идею. Для запроса 3, SELECT, ID, имя, возраст, зарплату от компании, где возрастная> (SELECT Возраст от компании, где ЗАРПЛАТА < 20000);Логика предложения WHERE вместе с> оператором и подзапросом

Суб-запрос будет узнать результат, где зарплата < 20000 первых, и это то, что QUERY2, как показано ниже. И тогда родительский запрос узнает результат, в котором используется вся запись возраста из таблицы КОМПАНИИ (всего 7 записей: 18,19,22,23,24,29,37) для сравнения с результатом возраста от подзапроса (всего 4 записи: 18,19,23,29), а затем показывают большую запись по возрасту.

Я ожидаю, что результат должен показать только идентификатор 7 только как ниже, так как только эта запись выполняется условие. Чем больше возраст от результата подзапроса (запрос 2) является 29, так что только эта запись возраст составляет более 29.


ID   NAME  AGE   SALARY 
7   Vicky  37   32500.0 

К сожалению, мои ожидания не соблюдено, и показать мне результат как запрос 3, как показано ниже.

Надеюсь понять логику, как ее работа для запроса 3, и надеюсь, что кто-то может помочь.

1.sqlite> SELECT ID, имя, возраст, ЗАРПЛАТА от компании;


ID   NAME  AGE   SALARY 
1   John  24   21000.0 
2   Davy  22   20000.0 
3   Kenny  19   9700.0  
4   Henry  23   13555.0 
5   Sam   18   17000.0 
6   Ray   29   8000.0  
7   Vicky  37   32500.0 

2.sqlite> SELECT ID, имя, возраст, ЗАРПЛАТА ОТ компании, где ЗАРПЛАТА < 20000;


ID   NAME  AGE   SALARY 
3   Kenny  19   9700.0  
4   Henry  23   13555.0 
5   Sam   18   17000.0 
6   Ray   29   8000.0  

3.sqlite> SELECT ID, имя, возраст, ЗАРПЛАТА ОТ компании, где возраст> (SELECT Возраст от компании, где ЗАРПЛАТА < 20000);


ID   NAME  AGE   SALARY  
1   John  24   21000.0 
2   Davy  22   20000.0 
4   Henry  23   13555.0 
6   Ray   29   8000.0  
7   Vicky  37   32500.0 
+0

Подзапрос должен возвращать только одну строку; поместите там совокупную функцию ('SELECT MIN (AGE) FROM ...' или что-то подходящее). IIRC SQLite должен быть ошибочным, если подзапрос, используемый в качестве выражения, возвращает несколько строк ... –

ответ

0

В догадка, так как он не выдаст ошибку (которая, кажется, лучшее представление о том, смотрите также полковник 32 в комментарий):

Sqlite просто выбирает первый возвращаемый возраст. Этот возраст должен быть случайным, но, исходя из результатов, показанных в вашем запросе 2, и предполагая некоторую согласованность, первый результат, вероятно, 19. Затем он выбирает все возрасты, превышающие 19, что вы видите в результатах запроса 3.

Перемешать все вокруг или создать еще один набор данных, и посмотреть, если то, что вы получаете сейчас от запроса 2 и 3 согласуются с этим предположением.

Кто-то может знать внутренности достаточно Sqlite, чтобы объяснить, почему это происходит.

Смежные вопросы