SELECT c.cust_id, c.cust_type_cd, c.city > FROM customer c > WHERE (SELECT SUM(a.avail_balance) > FROM account a > WHERE a.cust_id = c.cust_id) > BETWEEN 5000 AND 10000; ++++
| cust_id | cust_type_cd | city |
++++
| 4 | I | Waltham |
| 7 | I | Wilmington |
| 11 | B | Wilmington |
++++
3 rows in set (0.02 sec)
Этот вариант приведенного ранее запроса находит всех клиентов, чей
общий доступный остаток по всем счетам находится в диапазоне от
5000 до 10 000 долларов. И снова связанный подзапрос выполняется
13 раз (по разу для каждой строки), и каждое выполнение подзапроса
возвращает общий остаток по счетам данного клиента.
В конце предыдущего раздела было продемонстрировано, как прове
рять доступный и отложенный остатки счета по транзакциям, зареги
стрированным по данному счету, и я обещал показать, как изменить
пример для обработки всех счетов за одно выполнение. Вот тот пример:
SELECT 'ALERT! : Account #1 Has Incorrect Balance!'
FROM account
WHERE (avail_balance, pending_balance) <>
(SELECT SUM(),
SUM()
FROM transaction
WHERE account_id = 1)
AND account_id = 1;
При использовании связанного подзапроса вместо несвязанного основ
ной запрос может выполняться всего лишь один раз, а подзапрос будет
выполняться для каждого счета. Вот обновленная версия:
SELECT CONCAT('ALERT! : Account #', a.account_id,
' Has Incorrect Balance!')
FROM account a
WHERE (a.avail_balance, a.pending_balance) <>
(SELECT SUM(),
SUM()