Всем привет.
Помогите составить следующий запрос:
Есть таблица заказов (order):
order_id | order_title | order_date
493 | В поход | 01.01.2005
Таблица товаров (products)
prod_id | product_title
4534 | Резиновые сапоги
8873 | котелок
Таблица товаров, вошедших в заказ (items):
order_id | prod_id | is_main
493 | 4534 | 1
493 | 8873 | 0
В этой последней таблице один из товаров является главным. Он отмечается 1 в колонке is_main. Главный товар не обязательно присутствует, то есть могут быть только неосновные товары.
Хочется составить SQL запрос, который будет выводить список заказов следующим образом:
order_id | order_title | order_date | prod_id | product_title
493 | В поход | 01.01.2005 | 4534 | Резиновые сапоги
причем если главный товар пристутсвует в заказе, то только он и выводится (то есть строка для каждого order_id единственная),
а если главного товара нет, то выводится та же структура, вот только перечисляются уже все товары, вошедшие в заказ, то есть если бы сапоги не были главным товаром, то результат:
order_id | order_title | order_date | prod_id | product_title
493 | В поход | 01.01.2005 | 4534 | Резиновые сапоги
493 | В поход | 01.01.2005 | 8873 | котелок
У меня есть два варианта решения, но оба они имеют недостатки:
1)
SELECT o.*, p.* FROM orders o
INNER JOIN items i ON o.order_id=i.order_id AND i.is_main=1
INNER JOIN products p ON i.prod_id=p.prod_id
- этот запрос не покажет записи, у которых нет главного товара. Замена INNER JOIN на LEFT JOIN затормаживает выборку на порядки (!), СУБД FireBird, да и мало что дает, ведь в этом случае в столбцах prod_id и product_title вообще будет пусто.
2)
SELECT o.*, p.* FROM orders o
INNER JOIN items i ON o.order_id=i.order_id AND
i.is_main=
(
SELECT MAX(is_main) FROM items WHERE items.order_id=o.order_id
)
INNER JOIN products p ON i.prod_id=p.prod_id
- этот запрос выведет только главный товар, если он есть, и все неглавные, если главный отсутствует (как и надо). Но работает он очень медленно, поскольку есть подзапрос.
Спасибо за терпение дочитавшим этот пост до конца. Можно ли придумать запрос, который будет выполнять это быстро?