Подзапросы

Коррелированный подзапрос

Коррелированным подзапросом называется подзапрос, который ссылается на значения столбцов внешнего запроса.

Коррелированный подзапрос выполняется для каждой строки основного запроса. В момент выполнения подзапроса значения столбцов внешнего запроса являются константами.

Пример. Для каждого товара найдем магазины, в которых его можно купить по минимальной цене.

Весь каталог товаров:

SELECT *
  FROM product_price pp
 ORDER BY pp.product_id, pp.price, pp.store_id
#product_idstore_idprice
1130010500.00
2180012000.00
3130112500.00
4250026100.00
5260027500.00
............
13520123500.00
14550023500.00
15580024600.00
............

Оставим записи с минимальной ценой:

SELECT *
  FROM product_price pp
 WHERE pp.price = (SELECT min(ppm.price)
                     FROM product_price ppm
                    WHERE ppm.product_id = pp.product_id)
 ORDER BY pp.product_id, pp.price, pp.store_id
#product_idstore_idprice
1130010500.00
2250026100.00
3350022000.00
4440020000.00
5520123500.00
6550023500.00
............

Разберем, как получился такой результат. Для каждой строки, полученной в результате соединения таблицы из предложения FROM

#product_idstore_idprice
1130010500.00
2180012000.00
3130112500.00
4250026100.00
5260027500.00
............
13520123500.00
14550023500.00
15580024600.00
............

выполняется подзапрос

SELECT min(ppm.price)
  FROM product_price ppm
 WHERE ppm.product_id = pp.product_id

в котором pp.product_id заменяется значеним product_id из обрабатываемой строки.

Для строки

#product_idstore_idprice
1130010500.00

запрос

SELECT min(ppm.price)
  FROM product_price ppm
 WHERE ppm.product_id = 1

вернет значение 10500.00, которое совпадает с pp.price. Строка попадает в результат выполнения запроса.

Для строки

#product_idstore_idprice
2180012000.00
SELECT min(ppm.price)
  FROM product_price ppm
 WHERE ppm.product_id = 1

вернет значение 10500.00. Во второй строке pp.price = 12000.00. Строка исключается из результата выполнения запроса.

Третья строка исключается аналогично второй.

Для четвертой строки будет выполняться подзапрос

SELECT min(ppm.price)
  FROM product_price ppm
 WHERE ppm.product_id = 2

И так далее..

ПредыдущаяСледующая