SQL选择或连接表的两个子集



假设我的SQL Server数据库中有一个表Element,其中除了一个Id列之外什么都没有。

我还有表FooBar,它们都与Element有多对多的关系,比如我有一些表FooElement (FkId INT, FkFoo INT)BarElement (FkId INT, FkBar INT)来处理这种关系。请注意,元素可以链接到Foo或Bar,也可以两者都链接,也可以不链接。

如果我想找到哪些元素链接到Foo,我可以使用轻松找到它们

SELECT id FROM Element RIGHT JOIN FooElement

我可以很容易地为BarElements做同样的事情。

我的问题是:找到哪些元素链接到FooBar的最佳方法是什么?以下是我目前的解决方案,但我想知道是否有更好的选择,特别是在性能方面,因为所有三个表,尤其是Element,都将充满数据。

SELECT id 
FROM Element e
LEFT JOIN FooElement fe ON fe.FkId = e.Id
LEFT JOIN BarElement be ON be.FkId = e.Id
WHERE NOT (FkFoo IS NULL AND FkBar IS NULL)

我会使用exists:

SELECT e.id 
FROM Element e
WHERE EXISTS (SELECT 1
FROM FooElement fe 
WHERE fe.FkId = e.Id
) OR
EXISTS (SELECT 1
FROM BarElement be 
WHERE be.FkId = e.Id
);

对于FooElement(FkId)BarElement(FkId)上的索引,我希望它的性能与大多数备选方案相当或更好。

相关内容

  • 没有找到相关文章