2015-04-25 2 views
0

Предположим, у меня есть таблица Table1 с атрибутами id, Name, Address, Salary. Теперь я пишу следующий запрос:Как СУБД решает следующий запрос?

SELECT * FROM Table1 WHERE 2*Salary > (SELECT MAX(Salary) FROM Table1) 

Очевидно, что запрос

SELECT MAX(Salary) FROM Table1 

будет производить тот же результат для каждой строки в Table1. Так СУБД выполняет этот запрос агрегации один раз для каждой строки или выполняет его один раз и сохраняет значение, которое нужно сравнить с каждой строкой? Если да, то как СУБД решают, что результат этого запроса не зависит от строк в таблице1?

Потому что мне было интересно, что выполнение его один раз для каждой строки будет крайне неэффективным.

+0

Ваш подзапрос не коррелирован. Поэтому он будет рассчитан один раз. –

+0

решает, что результаты независимы, поскольку они не относятся к каким-либо таблицам из внешнего запроса. –

ответ

1

Попробуйте это первый магазин максимальное значение в переменной, а затем использовать эту переменную

Declare @Salary money 
    SELECT @Salary=MAX(Salary) FROM #yourTable 
    SELECT * FROM #yourTable WHERE 2*Salary > @Salary 
0

Вы можете использовать CROSS JOIN или , вроде этого:

SELECT t1.* 
FROM 
    Table1 t1 
    CROSS JOIN 
    (SELECT MAX(Salary) As maxSalary 
    FROM Table1) t2 
WHERE t1.Salary * 2 > t2.maxSalary 

Примечание:
Большинство систем RDBM на первых денежных столах затем просматривают их. Поэтому я фактически добавляю maxSalary к вашему Table1.

Я думаю, что запрос работает, потому что я не могу его проверить прямо сейчас.