Читайте также: |
|
Приведенный ранее в этой главе пример является несвязанным подза_ просом. Он может выполняться самостоятельно и не использует ниче_ го из содержащего выражения. Большинство подзапросов являются несвязанными. Только выражения update или delete часто используют связанные подзапросы (более подробно об этом позже). Упомянутый пример не только является несвязанным, но и возвращает таблицу, со_ стоящую всего из одной строки и одного столбца. Такой тип подзапро_ са называется скалярным подзапросом (scalar subquery), и его можно помещать в любую часть условия, использующего обычные операторы (=, <>, <, >, <=, >=). Следующие примеры показывают применение ска_ лярного подзапроса в условии неравенства:
mysql> SELECT account_id, product_cd, | cust_id, avail_balance | ||||||
_> FROM account | |||||||
_> WHERE | open_emp_id <> (SELECT e.emp_id | ||||||
_> FROM employee e INNER JOIN branch b | |||||||
_> | ON e.assigned_branch_id = b.branch_id | ||||||
_> WHERE e.title = 'Head Teller' AND b.city = 'Woburn'); | |||||||
+____________+____________+_________+_______________+ | |||||||
| account_id | | product_cd | cust_id | | avail_balance | | |||||
+____________+____________+_________+_______________+ | |||||||
| | | CHK | | | | | 1057.75 | | | ||
| | | MM | | | | | 2212.50 | | | ||
| | | CHK | | | | | 534.12 | | | ||
| | | SAV | | | | | 767.77 | | | ||
| | | MM | | | | | 5487.09 | | | ||
| | | CHK | | | | | 2237.97 | | | ||
| | | CHK | | | | | 122.37 | | | ||
| | | CD | | | | | 10000.00 | | | ||
| | | CHK | | | | | 3487.19 | | | ||
| | | SAV | | | | | 387.99 | | | ||
| | | CHK | | | | | 125.67 | | | ||
| | | MM | | | | | 9345.55 | | | ||
| | | CD | | | | | 1500.00 | | | ||
| | | CHK | | | | | 23575.12 | | | ||
| | | BUS | | | | | 0.00 | | | ||
| | | CHK | | | | | 38552.05 | | | ||
| | | SBL | | | | | 50000.00 | | |
Несвязанные подзапросы | |
+____________+____________+_________+_______________+ 17 rows in set (0.00 sec)
Этот запрос возвращает данные по всем счетам, которые были откры_ ты операционистом отделения Woburn, который не является старшим (подзапрос написан в предположении, что в отделении только один старший операционист). Подзапрос в этом примере немного сложнее, чем в предыдущем, – он соединяет две таблицы и включает два усло_ вия фильтрации. Подзапросы могут быть простыми или сложными на_ столько, насколько требуется. Они могут использовать любые из всех доступных блоков запроса (select, from, where, group by, having, order by).
Если при использовании в условии равенства подзапрос возвращает более одной строки, будет сформирована ошибка. Например, если пре_ дыдущий запрос изменить так, чтобы по подзапросу возвращались все операционисты отделения Woburn, а не только старший, будет полу_ чена следующая ошибка:
mysql> | SELECT account_id, product_cd, cust_id, avail_balance |
_> | FROM account |
_> | WHERE open_emp_id <> (SELECT e.emp_id |
_> | FROM employee e INNER JOIN branch b |
_> | ON e.assigned_branch_id = b.branch_id |
_> | WHERE e.title = 'Teller' AND b.city = 'Woburn'); |
ERROR 1242 (21000): Subquery returns more than 1 row
Если выполнить только подзапрос, результаты будут такими:
mysql> | SELECT e.emp_id | |||
_> | FROM | employee e | INNER JOIN branch b | |
_> | ON | e.assigned_branch_id = b.branch_id | ||
_> | WHERE e.title = 'Teller' AND b.city | = 'Woburn'; | ||
+________+ | emp_id | +________+
| 11 |
| | 12 | |
+________+
2 rows in set (0.02 sec)
Причина сбоя основного запроса в том, что выражение (open_emp_id) не может быть приравнено набору выражений (emp_id 11 и 12). Другими словами, единичный элемент не может приравниваться множеству. В следующем разделе вы увидите, как решить эту проблему с помо_ щью другого оператора.
Дата добавления: 2015-08-17; просмотров: 112 | Нарушение авторских прав
<== предыдущая страница | | | следующая страница ==> |
Типы подзапросов | | | Gt; FROM employee |