Если в вашей иерархии может быть только 2 уровня, то есть родитель не может сам иметь родителя, то это сделают два JOIN.
SELECT i.id AS item_id, i.title AS item_title
, c.category_refid, c.category_name
, c.parent_ref_id, p.category_name AS parent_name
FROM tmpos_menu_child i
JOIN tmpos_category c ON c.category_refid = i.category_ref_ids
LEFT JOIN tmpos_category p ON p.category_refid = c.parent_ref_id
Если иерархия может быть глубокой, вам следует использовать иерархический запрос, который в большинстве СУБД выполняется с помощью рекурсивного CTE (общее табличное выражение).
WITH RECURSIVE Item_and_Cat (item_id, item_title, category_level,
category_refid, category_name, parent_ref_id) AS (
SELECT i.id AS item_id, i.title AS item_title
, c.category_refid, c.category_name
, 1 AS category_level, c.parent_ref_id
FROM tmpos_menu_child i
JOIN tmpos_category c ON c.category_refid = i.category_ref_ids
UNION ALL
SELECT i.item_id, i.item_title
, p.category_refid, p.category_name
, i.category_level + 1 AS category_level, p.parent_ref_id
FROM Item_and_Cat i
JOIN tmpos_category p ON p.category_refid = i.parent_ref_id
)
SELECT item_id, item_title, category_refid, category_name, category_level
FROM Item_and_Cat
Примечание: Ключевое слово RECURSIVE
требуется для PostgreSQL и MySQL, но не разрешено для Oracle БД и SQL Сервер.
ОБНОВЛЕНИЕ
С комментарий :
я хочу, чтобы там были родители в виде записи (в отдельной строке)
Чтобы получить родительские записи в виде отдельных строк, дважды выполните запрос и объедините его с UNION
.
SELECT i.id AS item_id, i.title AS item_title
, c.category_refid, c.category_name, 0 AS is_parent
FROM tmpos_menu_child i
JOIN tmpos_category c ON c.category_refid = i.category_ref_ids
UNION ALL
SELECT i.id AS item_id, i.title AS item_title
, p.category_refid, p.category_name, 1 AS is_parent
FROM tmpos_menu_child i
JOIN tmpos_category c ON c.category_refid = i.category_ref_ids
JOIN tmpos_category p ON p.category_refid = c.parent_ref_id