Использование таблицы несколько раз

Если одну и ту же таблицу необходимо использовать в запросе несколько раз, то необходимо воспользоваться псевдонимами для таблиц. Например, для каждой стоимости товара в магазине найдем предложение на такой же товар в другом магазине по меньшей цене:

SELECT pp.product_id,
       pp.store_id,
       pp.price,
       ppl.store_id AS store_id_less,
       ppl.price AS price_less
  FROM product_price pp
  JOIN product_price ppl
    ON ppl.product_id = pp.product_id
   AND ppl.store_id != pp.store_id
   AND ppl.price < pp.price
 ORDER BY pp.product_id,
          pp.store_id,
          ppl.store_id,
          ppl.price
product_id store_id price store_id_less price_less
1 301 12500.00 300 10500.00
1 301 12500.00 800 12000.00
1 800 12000.00 300 10500.00
2 600 27500.00 500 26100.00
3 201 22900.00 500 22000.00
3 201 22900.00 800 22100.00
3 800 22100.00 500 22000.00

Разберемся, как это работает:

  1. Берутся все строки из таблицы product_price. Дальнейшее обращение к этому набору строк происходит через pp.
  2. Для каждой строки из пункта 1 просматривается еще раз все строки таблицы product_price. Обращение к строкам последней происходит через ppl.
  3. Если цена price у строки из второй копии product_price меньше, чем у строки из первой копии product_price, то связка этих строк добавляется в результат выполнения запроса.
  4. В конце результат сортируется согласно ORDER BY.

3.4 Несколько условий соединения

3.6 Типы соединения