#sql #sql-server #subquery #left-join #query-optimization
#sql #sql-server #подзапрос #левое соединение #оптимизация запросов
Вопрос:
Я подключил 2 таблицы с помощью inner join, но в 2 таблицах есть столбцы с одинаковыми именами. Я сделал свой запрос подзапросом, чтобы использовать только требуемый столбец. Приведет ли это к потере скорости, если я использую подзапрос?
Примечание: я использовал translate
Select
*
From
(Select
t1.Id, ...
From
Table1 as t1
left join
Table2 as t2 on t1.Id = t2.ParentId
--Where
--Id = 123 This Line. Error : Ambiguous column name 'Id'.
) as Foo
where
Id = 123
Комментарии:
1. Хм, вы, очевидно, знаете, как использовать псевдонимы и определять идентификаторы столбцов, так почему бы вам просто не сделать это в
WHERE
предложении, чтобы устранить двусмысленность? На вопрос: проверьте план. Но я думаю, что очень вероятно, что оптимизатор опускаетWHERE
предложение, и потери производительности нет.
Ответ №1:
В подзапросе нет необходимости. Вы устраняете неоднозначность, добавляя к столбцу префикс таблицы, к которой он принадлежит:
select t1.Id, ...
from Table1 as t1
left join Table2 as t2 on t2.ParentId = t1.Id
where t1.Id = 123 -- presumably
Что касается вашего исходного запроса: влияет ли использование подзапроса здесь на производительность? Я ожидал бы, что база данных, такая как SQL Server, предусматривает очевидную оптимизацию передачи предиката в подзапрос. Но вам нужно будет сравнить планы выполнения, чтобы убедиться.
Обратите внимание, что если вам действительно нужен подзапрос, обычно лучше выполнить предварительную фильтрацию:
select t1.Id, ...
from (select * from Table1 where Id = 123) as t1
left join Table2 as t2 on t2.ParentId = t1.Id
Комментарии:
1. Я не могу указать псевдоним таблицы для динамического условия
2. В вашем вопросе @A.CanD. нет динамического SQL , и даже если бы он был, вы все равно можете использовать псевдонимы объектов в динамических операторах.
Ответ №2:
В вашем запросе последняя строка, содержащая условие where, указывает псевдоним для идентификатора, что позволит избежать ошибки неоднозначности.