Sql通过多对多联系回归自我

时间:2014-07-06 07:14:06

标签: sql postgresql many-to-many self-join

需要一些sql帮助(pgsql,更喜欢一般的sql join或subselect语法):

entity (id, name)

tag (id, name)

entity_tag (entity_id, tag_id)

我需要能够使用一组标记ID(如1,2,3)来提供查询。我希望它返回所有连接的标签列表(通过entity_tag表)到具有一个或多个给定标签的实体。喜欢"还有哪些类似的实体标有"共同意义上的。

为此目的,最简单,性能最佳的SQL是什么?

2 个答案:

答案 0 :(得分:1)

select distinct t.id, t.name
from
    (
        select distinct entity_id
        from entity_tag
        where tag_id in (1, 2, 3)
    ) e
    inner join
    entity_tag et using (entity_id)
    inner join
    tag t on t.id = et.tag_id

子选择获取至少具有一个提供的标记的所有实体。然后将它连接到entity_tag以获取先前子选定实体的所有标记。最后的连接获取这些标签的名称。

答案 1 :(得分:0)

SELECT id FROM tag 
WHERE EXISTS 
(SELECT id from entity_tag)