2014-09-26 6 views
1

У меня есть требование разрешить поиск по имени (начинается с). В этом поиске будут возвращены все элементы, которые начинаются с букв (букв) и всех родителей, которые содержат дочерние элементы, начинающиеся с этих букв.Поиск для возврата как дочерних элементов, так и родительских элементов

Образец данных прилагается с моей попыткой сделать это. Есть ли лучший способ сделать это? Заранее большое спасибо.

declare @A table (ID int , 
       Name varchar(100), 
       ParentID int) 
INSERT INTO @A Values (1, 'Apples', 10) 
INSERT INTO @A Values (2, 'Bananas', 20) 
INSERT INTO @A Values (3, 'Mangos ', 30) 
INSERT INTO @A Values (4, 'Avocados ', 10) 
INSERT INTO @A Values (5, 'Blueberries ', 20) 
INSERT INTO @A Values (6, 'Blackberries ', 20) 
INSERT INTO @A Values (7, 'Apricots ', 10) 
INSERT INTO @A Values (10, 'Fruits beginning with A ', 0) 
INSERT INTO @A Values (20, 'Fruits beginning with B ', 0) 
INSERT INTO @A Values (30, 'Fruits beginning with C ', 0) 
-- when searching for A should find Apples, Avocados, Apricots 
-- and 'Fruits beginning with A' (ie their parent). 
DECLARE @Letter varchar (10) = 'A%' 

select id, name, ParentID from @a 
where name like @Letter 
UNION 
select id, name,parentID from @a 
where ID in (select distinct ParentID from @a 
where name like @Letter) 

ответ

0

Использование OR оператора:

select id, name,parentID 
from @a 
where name like @Letter or 
    ID in (select ParentID from @a 
     where name like @Letter) 

enter image description here

0

Вот один вариант использования EXISTS который имеет хороший план выполнения:

select id, name,parentID 
from a 
where exists (select 1 
       from a a2 
       where name like @Letter and (a.id = a2.id or a.id=a2.parentid)) 
+0

Спасибо! это работает для моих выборочных данных, но на моей реальной жизненной таблице рецептурных препаратов она длится долго. Мне нужно будет выполнить фактический план выполнения, чтобы увидеть, отсутствует ли какой-либо индекс. – Daisy

Смежные вопросы