2010-04-21 2 views
1

Я хотел бы присоединиться к таблице подзапросов/производных, содержащей предложение WITH (предложение WITH необходимо фильтровать на ROW_NUMBER() = 1). В Teradata что-то подобное будет работать нормально, но Teradata использует QUALIFY ROW_NUMBER() = 1 вместо предложения WITH.SQL Server: присоединиться к производной таблице, содержащей предложение WITH?

Вот моя попытка этого соединения:

-- want to join row with max StartDate on JobModelID 
INNER JOIN (
    WITH AllRuns AS (
     SELECT *, 
      ROW_NUMBER() OVER (PARTITION BY JobModelID ORDER BY StartDate DESC) AS RowNumber 
     FROM Runs 
    ) 
    SELECT * FROM AllRuns WHERE RowNumber = 1 
) Runs 
ON JobModels.JobModelID = Runs.JobModelID 

Что я делаю неправильно?

ответ

0

Добавление условия соединения, вероятно, менее эффективен, но, как правило, отлично работает для меня.

INNER JOIN (
    SELECT *, 
      ROW_NUMBER() OVER 
      (PARTITION BY JobModelID 
      ORDER BY StartDate DESC) AS RowNumber 
     FROM Runs 
    ) Runs 
ON JobModels.JobModelID = Runs.JobModelID 
AND Runs.RowNumber = 1 
+0

Любая идея, насколько это было бы менее эффективно? – jnylen

+1

@jnylen. Вы пытались профилировать этот запрос? Планы выполнения, Профайлер, Статистика клиентов? –

+0

@jnylen: Я согласен со свидетелем. Мое правило: если запрос возвращается в разумные сроки, все в порядке. Если нет, я начинаю искать горячие точки и пытаюсь реорганизовать. Мне никогда не приходилось перерабатывать код, как показано выше. – bernie

1

Вы можете использовать несколько предложений WITH. Что-то вроде

;WITH AllRuns AS ( 
     SELECT *, 
       ROW_NUMBER() OVER (PARTITION BY JobModelID ORDER BY StartDate DESC) AS RowNumber 
     FROM Runs 
), 
Runs AS(
     SELECT * 
     FROM AllRuns 
     WHERE RowNumber = 1 
) 

SELECT * 
FROM ... INNER JOIN ( 
     Runs ON JobModels.JobModelID = Runs.JobModelID 

Более подробно о использований/структуры/правила см WITH common_table_expression (Transact-SQL)

+0

Уродливый, но, похоже, работает. В чем принципиальная проблема - отсутствие поддержки предложений WITH в производных таблицах? Кроме того, я смог исключить второе предложение WITH, присоединившись к '(SELECT * FROM AllRuns WHERE RowNumber = 1)'. – jnylen

+0

Я бы расстроился из-за того, что множественные сглаживания в предложении с UGLY. Это немного отличается от синтаксиса для нескольких многоуровневых подборов **, что в большинстве случаев делает его чрезвычайно трудным для чтения. ** –

+0

Я имею в виду уродство в том смысле, что SQL для выполнения задачи подзапроса (фильтрация таблицы «Запускает» для получения одна строка в 'JobModelID') теперь разделена между началом запроса и подзапросом. – jnylen

Смежные вопросы