2014-12-15 1 views
2

У меня есть четыре таблицы уровня, тег, уровень_Таг и тег_иерархии. Как выбрать все теги уровня, которые имеют это условие id_tag ​​= id_parent, что означает, что тег является корнем. Я могу выбрать из таблицы join (может быть, не хорошая производительность?), Но я не знаю, как добавить сюда другое самостоятельное соединение.выберите между двумя отношениями «многие ко многим»

SELECT  level.name, tag.id, tag.name 
FROM   level INNER JOIN 
         tag_level ON level.id = tag_level.id_level INNER JOIN 
         tag ON tag_level.id_tag = tag.id 
WHERE  (level.Id = @id) 

Таблица тегов содержит тысячи строк, и я действительно беспокоюсь о проблемах с памятью и производительностью. Не могли бы вы помочь мне в этом? Вот схема

enter image description here

ответ

1

Попробуйте это:

;with cte as 
(select id_tag 
from tag_hierarchy where id_tag = id_parent) 

select l.name, t.id, t.name 
from cte c 
inner join tag t on t.id = c.id_tag 
inner join tag_level tl on t.id = tl.id_tag 
inner join level l on tl.id_level = l.id 
where l.lid = @id 
1

Может быть, вы можете добавить еще существует. Например:

SELECT   
    level.name, 
    tag.id, 
    tag.name 
FROM    
    level 
    INNER JOIN tag_level 
     ON level.id = tag_level.id_level 
    INNER JOIN tag 
     ON tag_level.id_tag = tag.id 
WHERE   
    (level.Id = @id) 
    AND EXISTS 
    (
     SELECT NULL 
     FROM Tag_hierarchy 
     WHERE Tag_hierarchy.id_tag=tag.id 
     AND Tag_hierarchy.id_tag=Tag_hierarchy.id_parent 
    ) 
+0

благодарит Arion за ваш ответ. Я думаю, что оба ответа почти одинаковы, и я выбрал другой, потому что он был опубликован ранее. – sina