я делаю что-то вроде:не удалось запросить таблицу псевдонимов
SELECT T1.NAME, T2.DATE
FROM T1
INNER JOIN
(
SELECT * FROM OTHERTABLE
) AS T2 ON T2.USERID = T1.USERID
, который работает, но если я запрашиваю таблицу псевдонимов, я получаю сообщение об ошибке, что Т2 недопустимое имя объекта.
Пример:
SELECT
T1.NAME,
T2.DATE,
CASE
WHEN EXISTS (SELECT TOP 1 1 FROM T2 WHERE T2.THISFIELD = T1.THISFIELD) THEN 'HELLO'
ELSE 'BYE'
END AS COMMENT -- THIS ALSO FAILS
FROM T1
INNER JOIN
(
SELECT * FROM OTHERTABLE
) AS T2 ON T2.USERID = T1.USERID
WHERE (SELECT COUNT(*) FROM T2) > 0
Я думал, что я сделал, "создать" Т2. Есть ли способ использовать T2 как таковой?
Моя цель - очистить все связанные данные от OTHERTABLE
один раз, потому что у меня будет много CASE в предложении SELECT в зависимости от того, существуют ли данные в T2 или нет. Я не хочу делать EXISTS для каждого поля, так как каждый раз запускает новый запрос в огромной таблице.
Вы из области видимости вашего 'SELECT COUNT ...' еще одна временной таблицы, которая не делает доступ к псевдониму – Mihai
Я думаю, вы немного запутались, его не будет быстрее, если вы пытаетесь перехитрить оптимизатор..Left Присоединяется должным образом к другому, а не к подзапросу, а затем использует coalesce или другую функцию, чтобы получить то, что вам нужно, даже внутреннего соединения достаточно. Где выбрать count - это действительно запутанный способ преследовать собственный хвост. Коррелированные запросы являются одним из самый быстрый способ получить данные в соединении, они не будут запускать огромную таблицу каждый раз – Mihai