выберите категории, для которых их родительский тип 1

#sql #sql-server

#sql #sql-сервер

Вопрос:

У меня есть эта таблица категорий

 |catId  |catName|catParentID|catType|
-------------------------------------
|1      |cat1   |null       |6      |
|2      |cat2   |null       |9      |
|3      |cat3   |1          |6      |
|4      |cat4   |2          |9      |
|5      |cat5   |1          |6      | 
|6      |cat6   |3          |8      |
 

родительские элементы находятся в одной таблице с подкатегориями, только у них нет родительского элемента.

мне нужно получить все подкатегории, тип которых для их родительского типа равен 6.

вывод приведенного выше примера должен выглядеть следующим образом-

 cat3
cat5
 

Комментарии:

1. #6 также должен быть возвращен на основе вашего описания проблемы.

Ответ №1:

Учитывая вашу структуру данных, это, похоже, работает:

 select c.*
from categories c
where c.catParentID is not null and -- has a parent
      c.catType = 6;
 

Однако это может быть не общим решением. Таким образом, вы можете использовать самосоединение:

 select c.*
from categories c join
     categories cp
     on c.catParentID = cp.catID
where cp.catType = 6;
 

Комментарии:

1. выберите категории, для которых их родительский тип 1? что это значит?

2. ну, основываясь на моем примере, вы, похоже, правы.. но в исходной таблице есть много подкатегорий, для которых их тип catType равен null.. поэтому мне нужно взять тип у родительского..

3. каким будет результат, если catName cat6 имеет 6 catType . Выбрана эта строка или нет?

Ответ №2:

 SELECT *
FROM   categories
WHERE  cattype = 6
       AND catparentid IS NOT NULL  
 

Ответ №3:

Самый простой способ,

 SELECT * FORM categories WHERE catParentId ='1' AND catType ='6'
 

Комментарии:

1. Я думаю, что это правильный ответ. Вопрос и описание слишком запутаны

Ответ №4:

Попробуйте это… (На основе желаемого результата)

 SELECT t1.*
FROM   tablename t1
       LEFT JOIN tablename t2 ON t1.catparentid = t2.catid
WHERE  t2.cattype = 6
       AND t2.catparentid IS NULL