|
Программирование >> Sql: полное руководство
Ниже приведено еще несколько примеров сравнения с результатом подчиненного запроса: Вывести список клиентов, которых обслуживает Билл Адаме. SELECT COMPANY FROM CUSTOMERS WHERE CUST REP = (SELECT EMPL NOM FROM SALESREPS WHERE NAME = Bill Adams) COMPANY Acme Mfg. Three-Way Lines Вывести список имеющихся в наличии товаров от компании ACI, количество которых превышает количество товара ACI-41004 SELECT DESCRIPTION, QTY ON HAND FROM PRODUCTS WHERE MFR ID = ACI AND QTy on HAND > (SELECT QTY ON HAND FROM PRODUCTS WHERE MFR ID = ACI AND PRODOCT ID = 41004) DESCRIPTION QTY ON HAND Size 3 Widget 207 Size 1 Widget 277 Size 2 Widget 167 Обратите внимание на то, что сотасно стандарту SQL1 подчиненный запрос в операции сравнения может стоять только справа от опфатора сравнения. Неравенство А < (подчиненный запрос) разрешается, а неравенство (подчиненный запрос) > А недопустимо. Сказанное не ограничивает возможности операции сравнения, поскольку знак любого неравенства всегда можно перевернуть так, чтобы подчршенный запрос оказался с правой стороны. Однако это говорит о том, что иногда требуется переворачивать логику словесного запроса так, чтобы он формально соответствовал действительной инструкции SQL. Стандарт SQL2 устраняет подобное ограничение и позволяет подчиненному запросу находиться с любой стороны от оператора сравнения. Более того, стандарт идет еще дальше и допускает выполнение сравнения с целой строкой значений, а не только с единичным значением. Эти и другие возможности составления сложных запросов описываются ниже в настоящей главе. Следует, однако, учитывать, что подобные запросы, как правило, не поддерживаются текущими версиями ведущих СУБД. По этой причине при составлении подчиненных запросов рекомендуется придерживаться ограничений, накладываемых стандартом SQLL проверка на принадлежность результатам подчиненного запроса (предикат IN) - проверяемое выражение ;- IN-подчиненный запрос- L-NOT-J Рис 94 Синтаксическая диагра\лма проверки на принадлежность резулыа1ам подчиненного запроса (предикат IN) Как показано на рис. 9.4, проверка на принадлежность результатам подчиненного запроса (предикат in) является видоизмененной формой простой проверки на член;тво в множестве Одно значение сравнивается со столбцом данных, которые возвращаются подчиненным запросом, и если это значение равно одному из элементов столбца, проверка дает результат true Данная проверка используется, когда необходимо сравнить значение из проверяемой строки с множеством значений, отобранных подчиненным запросом. Вот простой пример: Вывести список служащих тех офисов, где фактический объем продаж превышает плановый. SELECT NAME FROM SALESREPS WHERE REP OFFICE IN (SELECT OFFICE FROM OFFICES WHERE SALES > TARGET) NAME Mary Jones Sam Clark Bill Adams Sue Smith Larry Fitch Подчиненный запрос возвращает список идентификаторов офисов, где фактический объем продаж превьпиает плановый (в учебной базе данных есть три таких офиса - с номерами 11,13 и 21). Главный запрос затем проверяет каждую строку таблицы sales-Reps , чтобы определить, работает ли соответствующий служащий в одном из отобранных офисов. Ниже приведено еще несколько аналогичных примеров: Вывести список служащих, не работающих в офисах, которыми руководит Ларри Фитч (служащий с идентификатором 108). SELECT NAME FROM SALESREPS WHERE REP OFFICE NOT IN (SELECT OFFICE FROM OFFICES WHERE MGR = 108) NAME Bill Adams Mary Jones Sam Clark Bob Smith Dan Roberts Paul Cruz Вывести список всех клиентов, заказавших изделия компании ACI (идентификатор изготовителя -ACI, идентификаторы товаров начинаются с номера 4100) в период между январем и июнем 1990 года. SELECT COMPANY FROM CUSTOMERS WHERE CUST NUM IN (SELECT DISTINCT CUST FROM ORDERS WHERE MFR = ACI AND PRODUCT LIKE 4100% AND ORDER DATE BETWEEN Ol-JAN-90 AND 30-JAN-90) COMPANY Acme Mfg. Ace International Holm & Landis JCP Inc. Bo всех приведенных примерах подчиненный запрос возвращает в качестве результата столбец данных, а предложение where главного запроса проверяет, равно ли значение из строки таблицы главного запроса одному из значений в полученном столбце. Таким образом, проверка in с подчиненным запросом выполняется аналогично простой проверке in, за исключением того что множество значений задается подчиненным запросом, а не указьшается явно в инструкции select. Проверка на существование (предикат EXISTS) Как показано на рис. 9.5, в результате проверки на существование (предикат exists) можно выяснить, содержится ли в таблице результатов подчиненного запроса хотя бы одна строка. Аналогичной простой проверки не существует. Проверка на существование допустима только в подчиненных запросах. -NOT-t EXISTS -подчиненный запрос- -NOT , I. C.iTi . и rraa/iMiorpciMMO проверки МП сумсс<п-чани<}(пр!.1.\1 Вот пример запроса, который можно легко сформулировать, используя проверку на существование: Вывести список товаров, на которые получен заказ стоимостью $25000 или больше .
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |