假设我的SQL Server数据库中有一个表Element
,其中除了一个Id
列之外什么都没有。
我还有表Foo
和Bar
,它们都与Element
有多对多的关系,比如我有一些表FooElement (FkId INT, FkFoo INT)
和BarElement (FkId INT, FkBar INT)
来处理这种关系。请注意,元素可以链接到Foo或Bar,也可以两者都链接,也可以不链接。
如果我想找到哪些元素链接到Foo,我可以使用轻松找到它们
SELECT id FROM Element RIGHT JOIN FooElement
我可以很容易地为BarElements做同样的事情。
我的问题是:找到哪些元素链接到Foo
或Bar
的最佳方法是什么?以下是我目前的解决方案,但我想知道是否有更好的选择,特别是在性能方面,因为所有三个表,尤其是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)
上的索引,我希望它的性能与大多数备选方案相当或更好。