SQL для объединения одной таблицы в другую таблицу несколько раз? (Отображение продуктов по категориям)

Допустим, у меня естьProduct, Category, а такжеProduct_To_Category Таблица. Продукт может быть в нескольких категориях.

    Product                     Category        Product_to_category
    ID   |   NAME               ID  | Name      Prod_id | Cat_id
    =====================       ============    ===================
        1| Rose                    1| Flowers          1| 1
        2| Chocolate Bar           2| Food             2| 2
        3| Chocolate Flower                            3| 1
                                                       3| 2

Я хотел бы запрос SQL, который дает мне такой результат, как

    ProductName      | Category_1 | Category_2 | Category_3
    =======================================================
    Rose             | Flowers    |            |
    Chocolate Flower | Flowers    | Food       |

и т.п.

Лучший способ добиться этого - объединить кучу запросов; один запрос для каждого ожидаемого количества категорий для данного продукта.

select p.name, cat1.name, cat2.name
from
  product p, 
  (select * from category c, producttocategory pc where pc.category_id = c.id) cat1,
  (select * from category c, producttocategory pc where pc.category_id = c.id) cat2
where p.id = cat1.id 
  and p.id = cat2.id
  and cat1.id != cat2.id
union all
select p.name, cat1.name, null
from
  product p, 
  (select * from category c, producttocategory pc where pc.category_id = c.id) cat1
where p.id = cat1.id 
  and not exists (select 1 from producttocategory pc where pc.product_id = p.id and pc.category_id != cat1.id)

Есть несколько проблем с этим.

Во-первых, я должен повторить этот союз для каждой ожидаемой категории; если товар может быть в 8 категориях, мне нужно 8 запросов.Во-вторых, категории не помещаются в одинаковые столбцы. Например, иногда продукт может иметь «Еда, Цветы», а другой раз - «Цветы, Еда».

Кто-нибудь знает лучший способ сделать это? Кроме того, у этой техники есть техническое название?

Ответы на вопрос(4)

Ваш ответ на вопрос