Re: Эмуляция иерархии на SQL
От: naf_2000  
Дата: 30.07.09 05:45
Оценка:
улучшил:
SELECT 
G1.ID ID ,G1.NAME NAME, 
      SUM(
      CASE WHEN G1.LEFTBOUND BETWEEN G2.LEFTBOUND AND G2.RIGHTBOUND THEN 1
           ELSE 0
      END) LEV
FROM GOOD G1
LEFT JOIN GOOD G2 ON NOT(G1.ID=G2.ID)
LEFT JOIN GOOD GI1 ON (G1.LEFTBOUND BETWEEN GI1.LEFTBOUND AND GI1.RIGHTBOUND)
LEFT JOIN GOOD GI2 ON (G2.LEFTBOUND BETWEEN GI2.LEFTBOUND AND GI2.RIGHTBOUND)
WHERE
     ((GI1.PARENT=GI2.PARENT) OR ((GI1.PARENT IS NULL)AND(GI2.PARENT IS NULL))) AND
     (NOT(GI1.ID=GI2.ID) OR (G1.ID=GI1.ID) OR (G2.ID=GI2.ID))   
GROUP BY G1.ID, G1.NAME
ORDER BY
     SUM( 
     CASE
       WHEN G2.LEFTBOUND BETWEEN G1.LEFTBOUND AND G1.RIGHTBOUND THEN 1
       WHEN G1.LEFTBOUND BETWEEN G2.LEFTBOUND AND G2.RIGHTBOUND THEN 0
       WHEN (GI1.ISGROUP>GI2.ISGROUP) THEN 1
       WHEN (GI1.ISGROUP<GI2.ISGROUP) THEN 0        
       WHEN (GI1.NAME<GI2.NAME) THEN 1        
       ELSE 0
     END) DESC
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.