2010-04-21 45 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 2010-04-21 17:13:56

+1

@jnylen,你有没有试图分析这个查询?执行计划,Profiler,客户统计? – 2010-04-21 17:30:41

+0

@jnylen:我同意你的观点。我的经验法则:如果查询在合理的时间内恢复,那就没问题。如果不是,我开始寻找热点并尝试重构。我从来没有像上面显示的那样重构代码。 – bernie 2010-04-21 17:48:20

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子句的支持?另外,我可以通过加入'(SELECT * FROM AllRuns WHERE RowNumber = 1)'来消除第二个WITH子句。 – jnylen 2010-04-21 16:44:57

+0

我会不同意这样一个事实,即在with子句中的多个记述是UGLY。它与多层次子选择略有不同,**在大多数情况下,它使得它非常难以阅读。** – 2010-04-21 16:51:11

+0

我的意思是,在执行子查询任务时使用SQL(过滤“运行”表以获取“JobModelID”每行一行)现在在查询的开始和子查询之间分开。 – jnylen 2010-04-21 17:03:04