Say I have a table Element in my SQL Server database with, we’ll suppose, nothing other than an Id column.
I also have tables Foo and Bar, which each have a many-to-many relationship with Element, such as I have some tables FooElement (FkId INT, FkFoo INT) and BarElement (FkId INT, FkBar INT) tables to handle the relationship. Note that Elements can be either linked to a Foo, a Bar, both or none.
If I want to find which Elements are linked to a Foo, I can easily find them using
SELECT id FROM Element RIGHT JOIN FooElement
And I can easily do the same for BarElements.
Here is my question: what is the best way to find which Elements are either linked to a Foo or a Bar? Below is my current solution, but I was wondering if there was a better option, in particular performance-wise, as all three tables, especially Element will be extremely packed with data.
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)
Advertisement
Answer
I would use 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
);
With indexes on FooElement(FkId) and BarElement(FkId), I would expect this to have comparable or better performance than most alternatives.