Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Иерархический тип данных подъём вверх  [new]
NIIIK
Member

Откуда: Россия, Ростовская область, г. Таганрог
Сообщений: 1295
Всем доброе время суток.

Проблема в то что я используя иерерхический тип данных поднимаюсь вверх и "останавливаюсь" на нужном уровне (отфильтровываю одно из родительских записей)

что самое странное, запрос в духе

    inner
     join dbo.tCommonDictionary cd_loc with(nolock)  
       on cd_loc.pk = edk_loc.fkValue
      --and cd_loc.deleted = 0
      	   
	 
	 left	 
     join dbo.tCommonDictionary cd_area with(nolock)
       --on cd_loc.hrchID.GetAncestor(5) = cd_area.hrchID
	   --on cd_loc.hrchID.IsDescendantOf(cd_area.hrchID) = 1   
	   --This IDEA in "TESTING MODE". Don't use it without understanding 
	   on cd_area.hrchID in (cd_loc.hrchID.GetAncestor(3), cd_loc.hrchID.GetAncestor(4), cd_loc.hrchID.GetAncestor(5), cd_loc.hrchID.GetAncestor(6))
	  and cd_area.fkType = @COMPANY_GEOGRAPHY_AREA
      --and cd_area.deleted = 0

     left
     join dbo.tCommonDictionary cd_region with(nolock)
       --on cd_loc.hrchID.IsDescendantOf(cd_region.hrchID) = 1
	   on cd_loc.hrchID in (cd_loc.hrchID.GetAncestor(3), cd_loc.hrchID.GetAncestor(4), cd_loc.hrchID.GetAncestor(5))
      and cd_region.fkType = @COMPANY_GEOGRAPHY_REGION
      --and cd_region.deleted = 0        
            
     left
     join dbo.tCommonDictionary cd_zone with(nolock)
       --on cd_loc.hrchID.IsDescendantOf(cd_zone.hrchID) = 1
	   on cd_zone.hrchID in (cd_loc.hrchID.GetAncestor(3), cd_loc.hrchID.GetAncestor(4))
      and cd_zone.fkType = @COMPANY_GEOGRAPHY_ZONE


Чем та же логика через

on cd_loc.hrchID.IsDescendantOf(cd_area.hrchID) = 1   


Использовать вариант в духе
cd_loc.hrchID.GetAncestor(5) = cd_area.hrchID

я не могу, потому что любой уровень может быть "пропущен".

Могу сказать что такие проверки "подтормаживают" запрос".
Есть конечно идея "подджойнить всё", и потом case-операторами проверять но идея изначально "не нравится".
25 мар 13, 15:20    [14092582]     Ответить | Цитировать Сообщить модератору
 Re: Иерархический тип данных подъём вверх  [new]
NIIIK
Member

Откуда: Россия, Ростовская область, г. Таганрог
Сообщений: 1295
в приаттаченном примере ошибка в значении уровня, но суть вопроса та же.
25 мар 13, 15:40    [14092696]     Ответить | Цитировать Сообщить модератору
 Re: Иерархический тип данных подъём вверх  [new]
Гость333
Member

Откуда:
Сообщений: 3683
NIIIK
в приаттаченном примере ошибка в значении уровня, но суть вопроса та же.

Никакого вопроса не было задано, поэтому непонятно, о какой сути идёт речь.
25 мар 13, 15:55    [14092791]     Ответить | Цитировать Сообщить модератору
 Re: Иерархический тип данных подъём вверх  [new]
NIIIK
Member

Откуда: Россия, Ростовская область, г. Таганрог
Сообщений: 1295
Гость333
NIIIK
в приаттаченном примере ошибка в значении уровня, но суть вопроса та же.

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


Подняться по иерархии вверх до нужного уровня быстро как метом с on cd_loc.hrchID.IsDescendantOf(cd_area.hrchID) = 1 и быстро, а то "колхоз с OR быстрее работает", КАК ?!
25 мар 13, 16:27    [14092998]     Ответить | Цитировать Сообщить модератору
 Re: Иерархический тип данных подъём вверх  [new]
Гость333
Member

Откуда:
Сообщений: 3683
В стартовом сообщении:
NIIIK
что самое странное, запрос в духе
...

Чем та же логика через
...

— следует читать как
что самое странное, запрос в духе
...

работает быстрее, чем та же логика через
...

?
25 мар 13, 16:35    [14093075]     Ответить | Цитировать Сообщить модератору
 Re: Иерархический тип данных подъём вверх  [new]
NIIIK
Member

Откуда: Россия, Ростовская область, г. Таганрог
Сообщений: 1295
Гость333,

в стартовом сообщении тоже следует читать, только там "колхоз с OR заменён на колхоз с IN"

Собственно самый быстрый из костылей
select ...
                   cd_loc.pk as fkHQ,
          cd_loc.name as nameHQ,
		  
		  case
		   when cd_loc_6.fkType = @COMPANY_GEOGRAPHY_AREA then cd_loc_6.pk
		   when cd_loc_5.fkType = @COMPANY_GEOGRAPHY_AREA then cd_loc_5.pk
		   when cd_loc_4.fkType = @COMPANY_GEOGRAPHY_AREA then cd_loc_4.pk
		   when cd_loc_3.fkType = @COMPANY_GEOGRAPHY_AREA then cd_loc_3.pk
		  end as fkArea,
		  
		  case
		   when cd_loc_6.fkType = @COMPANY_GEOGRAPHY_AREA then cd_loc_6.name
		   when cd_loc_5.fkType = @COMPANY_GEOGRAPHY_AREA then cd_loc_5.name
		   when cd_loc_4.fkType = @COMPANY_GEOGRAPHY_AREA then cd_loc_4.name
		   when cd_loc_3.fkType = @COMPANY_GEOGRAPHY_AREA then cd_loc_3.name
		  end as nameArea,
		  
		  case
		   when cd_loc_5.fkType = @COMPANY_GEOGRAPHY_REGION then cd_loc_5.pk
		   when cd_loc_4.fkType = @COMPANY_GEOGRAPHY_REGION then cd_loc_4.pk
		   when cd_loc_3.fkType = @COMPANY_GEOGRAPHY_REGION then cd_loc_3.pk
		  end as fkRegion,
		  
		  case
		   when cd_loc_5.fkType = @COMPANY_GEOGRAPHY_REGION then cd_loc_5.name
		   when cd_loc_4.fkType = @COMPANY_GEOGRAPHY_REGION then cd_loc_4.name
		   when cd_loc_3.fkType = @COMPANY_GEOGRAPHY_REGION then cd_loc_3.name
		  end as nameRegion,
		  
		  case
		   when cd_loc_4.fkType = @COMPANY_GEOGRAPHY_ZONE then cd_loc_4.pk
		   when cd_loc_3.fkType = @COMPANY_GEOGRAPHY_ZONE then cd_loc_3.pk
		  end as fkZone,
		  
		  case
		   when cd_loc_4.fkType = @COMPANY_GEOGRAPHY_ZONE then cd_loc_4.name
		   when cd_loc_3.fkType = @COMPANY_GEOGRAPHY_ZONE then cd_loc_3.name
		  end as nameZone,
  ....

from ...
    inner
     join dbo.tCommonDictionary cd_loc with(nolock)  
       on cd_loc.pk = edk_loc.fkValue
      --and cd_loc.deleted = 0
     

	 left	 
     join dbo.tCommonDictionary cd_loc_6 with(nolock)
	   on cd_loc_6.hrchID = cd_loc.hrchID.GetAncestor(1)

	 left	 
     join dbo.tCommonDictionary cd_loc_5 with(nolock)
	   on cd_loc_5.hrchID = cd_loc.hrchID.GetAncestor(2)

	 left	 
     join dbo.tCommonDictionary cd_loc_4 with(nolock)
	   on cd_loc_4.hrchID = cd_loc.hrchID.GetAncestor(3)

	 left	 
     join dbo.tCommonDictionary cd_loc_3 with(nolock)
	   on cd_loc_3.hrchID = cd_loc.hrchID.GetAncestor(4) 
25 мар 13, 17:21    [14093430]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить