SELECT Name, Category
FROM t1
JOIN t_right
ON right_category = category
UNION
SELECT Name, Category
FROM t2
JOIN t_right
ON right_category = category
SELECT *
FROM (
SELECT Name, Category
FROM t1
UNION
SELECT Name, Category
FROM t2
) t
JOIN t_right
ON right_category = category
Эти запросы не идентичны: второй может возвращать дубликаты, если более двух записей в правой таблице могут удовлетворять условию соединения, например:
t1
Name Category
--- ---
Apple 1
t2
Name Category
--- ---
Apple 1
t_right
Category
---
1
1
Первый запрос вернет Apple, 1
один раз, второй запрос вернет его дважды.
С точки зрения производительности трудно сказать, какой запрос будет более эффективным, пока мы не увидим ваши данные:
Первый вариант может повысить эффективность за счет применения различных алгоритмов к каждому запросу.
Второй вариант может повысить эффективность, прочитав правую таблицу только один раз.
Как очень грубое практическое правило, первый вариант будет более эффективным, если условие соединения является выборочным для t1
и t2
, тогда как второй вариант будет более эффективным, если это не так.
Однако в простых случаях (объединение при sargable условии с несколькими значениями высокой мощности) оптимизатор SQL Server
вытолкнет конкатенацию из подзапроса, чтобы она была идентична следующему запросу:
SELECT Name, Category
FROM t_right
CROSS APPLY
(
SELECT Name, Category
FROM t1
WHERE t1.Category = t_right.category
UNION
SELECT Name, Category
FROM t2
WHERE t2.Category = t_right.category
) t