Как избежать повторяющегося подзапроса JOIN в SQL? - PullRequest
4 голосов
/ 25 марта 2010

В SQL Server 2008:

У меня есть одна таблица, и я хочу сделать что-то вроде следующего:

SELECT T1.stuff, T2.morestuff from
(
 SELECT code, date1, date2 from Table
) as T1
INNER JOIN
(
 SELECT code, date1, date2 from Table
) as T2

ON T1.code = T2.code and  T1.date1 = T2.date2

Два подзапроса абсолютно идентичны.Есть ли способ сделать это без повторения скрипта подзапроса?

Спасибо

Карл

Ответы [ 4 ]

7 голосов
/ 25 марта 2010

CTE

;WITH YourQuery AS
(
 SELECT code, date1, date2 from Table
)
SELECT 
    T1.stuff, T2.morestuff 
    from YourQuery           T1
        INNER JOIN YourQuery T2 ON T1.code = T2.code and  T1.date1 = T2.date2

FYI

В этом вопросе код использует производные таблицы, также известные как встроенные представления. Подзапрос - это запрос SELECT, который возвращает одно значение и вложен в оператор SELECT, INSERT, UPDATE или DELETE или в другой подзапрос. Подзапрос может использоваться везде, где разрешено выражение. Смотри: http://msdn.microsoft.com/en-us/library/aa213252(SQL.80).aspx

0 голосов
/ 25 марта 2010

Почему псевдоним таблицы не будет работать дважды?

SELECT T1.stuff, T2.stuff FROM Table as T1 INNER JOIN Table as T2
ON T1.code = T2.code and  T1.date1 = T2.date2
0 голосов
/ 25 марта 2010

Почему они вообще подзапросы?

SELECT T1.stuff, T2.morestuff
FROM Table T1
INNER JOIN Table T2
ON T1.code = T2.code and T1.date1 = T2.date2
0 голосов
/ 25 марта 2010

Вы можете использовать вид.

CREATE VIEW myView AS 
SELECT code, date1, date2 
FROM Table

И тогда ваш запрос будет выглядеть примерно так:

SELECT T1.stuff, T2.morestuff 
FROM myView as T1
INNER JOIN myView as T2 ON T1.code = T2.code and  T1.date1 = T2.date2
...