Я хотел бы иметь строки, как одна таблица, как показано ниже
id name parentId
Мои текущие таблицы (ключи между ними являются внешними ключами)
category
id name
который является родителем всех и
subcategory
id name catId
и последняя таблица, которая является деятельностью
activity
id name subcatId
Для parentId таблицы категорий это не будет ничего, поскольку category является родителем всех
Моя попытка до сих пор не увенчалась успехом
Пример данных
category
C-1 HR null
C-2 Development null
subcategory
SC-1 Hiring C-1
SC-2 Admin C-1
SC-3 Developer C-2
activity
A-1 College Hiring SC-1
A-2 Job Fair SC-1
A-3 Java Development SC-3
Result Needed
1 HR null
2 Development null
3 Hiring C-1
4 Admin C-1
5 Developer C-2
6 College SC-1
7 Job Fair SC-1
8 Java Development SC-3
Я надеюсь, что это понятнее. Если вам нужна дополнительная информация, пожалуйста, дайте мне знать, спасибо
моя попытка на 2 столах
select name
from (
select c.name
from category c
union all
select b.name
from subcategory b
inner join category ca
on ca.id = b.parentId
)
Я получаю сообщение об ошибке
Каждая производная таблица должна иметь свой псевдоним
Нужно ли добавить следующие строки в мой запрос
start with parent_id is null
connect by prior id = parent_id
Попробуйте что-то вроде этого:
SELECT @id := @id + 1 AS id, name, parent_id
FROM ( SELECT name, NULL AS parent_id FROM category
UNION ALL
SELECT id, name, catId FROM subcategory
UNION ALL
SELECT id, name, parentId FROM activity
) q,
( SELECT @id := 0 ) w;
UNION ALL
для объединения результатов нескольких запросов.UNION
имена столбцов первого запроса используются в качестве имен столбцов набора результатов.@id
и оператор присваивания :=
для генерации рассчитанных значений ID
столбца.LIMIT
или OFFSET
, значения id
столбца не будут согласованными.NULL
.
=
вместо :=
.... Исправлено.
На самом деле, как это должно решить вашу проблему:
select name
from (
select c.name
from category c
union all
select b.name
from subcategory b
inner join category ca
on ca.id = b.parentId
) A -- alias is required for sub-query.
Вы можете установить в качестве псевдонима что угодно, при условии, что это не будет конфликтовать с некоторыми зарезервированными словами MySQL. Вы можете установить так же ) AS A
В вашей ситуации я не считаю необходимым выполнять подзапрос или внутреннее соединение. Если вы действительно хотите, чтобы результат был таким, вы можете просто использовать union all:
SELECT name,'' as ID from category
UNION ALL
SELECT name,catId FROM subcategory
UNION ALL
SELECT name,subcatId FROM activity;
) A
.. Затем попробуйте выполнить снова