2015-07-08 3 views
0

я делаю что-то вроде:не удалось запросить таблицу псевдонимов

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 для каждого поля, так как каждый раз запускает новый запрос в огромной таблице.

+1

Вы из области видимости вашего 'SELECT COUNT ...' еще одна временной таблицы, которая не делает доступ к псевдониму – Mihai

+0

Я думаю, вы немного запутались, его не будет быстрее, если вы пытаетесь перехитрить оптимизатор..Left Присоединяется должным образом к другому, а не к подзапросу, а затем использует coalesce или другую функцию, чтобы получить то, что вам нужно, даже внутреннего соединения достаточно. Где выбрать count - это действительно запутанный способ преследовать собственный хвост. Коррелированные запросы являются одним из самый быстрый способ получить данные в соединении, они не будут запускать огромную таблицу каждый раз – Mihai

ответ

1

Ваш запрос, используя подзапрос SELECT * FROM OTHERTABLE, который не имеет смысла. Вы можете его изменить;

SELECT 
T1.NAME, 
T2.DATE, 
... 

FROM T1 
    JOIN OTHERTABLE T2 ON T2.USERID = T1.USERID 
WHERE (SELECT COUNT(*) FROM OTHERTABLE) > 0 

Вы не можете использовать подзапрос несколько раз в том же запросе. Вместо этого используйте для этой цели Common Table Expression (CTE). T2 является CTE в следующем примере.

;WITH T2 AS 
(
    SELECT UserId, col1, col2, [Date] 
    FROM OtherTable 
) 
SELECT T1.NAME, T2.DATE 
FROM T1 
    JOIN T2 ON T2.USERID = T1.USERID 
WHERE (SELECT COUNT(*) FROM T2) > 0