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

dialog.afterClosed().pipe(
  mergeMap(result1 => this.unitService.importPack(result.file).pipe(
    map(result2 => ({ result1, result2 }))
  ))
).subscribe(({ result1, result2 }) => { ... });

Сопоставьте результат второго запроса, чтобы получить желаемый результат. Здесь я возвращаю объект типа { result1: any, result2: any }

5
задан Mr. Shiny and New 安宇 20 April 2009 в 18:17
поделиться

4 ответа

I don't know what RDBMS you're using, but in MySQL you can use GROUP_CONCAT:

SELECT
  p.name,
  GROUP_CONCAT(c.name SEPARATOR ', ') AS categories
FROM
  product p
  JOIN product_to_category pc ON p.id = pc.product_id
  JOIN category c ON c.id = pc.category_id
GROUP BY
  p.name
ORDER BY
  p.name,
  c.name
9
ответ дан 13 December 2019 в 05:42
поделиться

Ответ Себа поставил меня на правильный путь для обходного пути. Я использую Oracle, и он имеет функции, которые имитируют MYSQL group_concat . Вот пример. Это не генерирует столбцы и, следовательно, не так хорошо, как решение на чистом SQL, но подходит для моих текущих целей.

with data as
( 
  select 
    pc.id cat,
    p.id prod, 
    row_number() over( partition by p.id order by pc.id) rn,
    count(*) over (partition by p.id) cnt
  from product_to_category pc, product p
  where pc.product_id = p.id
)
select prod, ltrim(sys_connect_by_path(cat, ','), ',') cats
  from data
 where rn = cnt
 start with rn = 1 connect by prior prod = prod and prior rn = rn - 1
 order by prod

Это генерирует такие данные, как

PROD | CATS
===========
284  |   12
285  |   12
286  | 9,12

. Я могу редактировать столбец ltrim (sys_connect_by_path ()) по мере необходимости, чтобы генерировать любые данные, которые мне нужны.

1
ответ дан 13 December 2019 в 05:42
поделиться
SELECT p.name, cat_food.name, cat_flowers.name
FROM
  product p
  left outer join  Product_to_category pc_food 
    on p.id = pc_food.Prod_id
  left outer join Category cat_food
    on pc_food.Cat_id = cat_food.id
    AND cat_food.name = 'Food'
  left outer join  Product_to_category pc_flowers
    on p.id = pc_flowers.Prod_id
  left outer join Category cat_flowers
    on pc_flowers.Cat_id = cat_flowers.id
    AND cat_flowers.Name = 'Flowers'

Это работает, только если вы знаете количество возможных категорий, чтобы поместить их в столбцы. Вот как (стандартный) SQL работает, число столбцов не является динамическим.

1
ответ дан 13 December 2019 в 05:42
поделиться

Вы не можете создать эти результаты с помощью строгого запроса SQL. То, что вы пытаетесь создать, называется сводной таблицей . Многие инструменты отчетности поддерживают такое поведение, когда вы выбираете свой продукт и категорию, а затем превращаете категорию в сводный столбец.

Я считаю, что службы аналитики SQL Server также поддерживают подобные функции, но у меня нет опыта работы со SSAS.

1
ответ дан 13 December 2019 в 05:42
поделиться
Другие вопросы по тегам:

Похожие вопросы: