2011-10-31 92 views
0

我试图使用下面的查询(它完美地工作),作为UPDATE语句的子查询,并且需要在该UPDATE语句中引用值CORRECT_DATE。如果我可以在这个查询中成功地选择这个值,将它传递给UPDATE会很容易,但我似乎无法选择下面的相关子查询值,并在不等式中使用它。在主要查询中使用相关子查询的值

SELECT A.NAME, MAX(A.[START]) 
FROM dbo.TANK A 
WHERE A.[CURRENT] = 0 AND A.[END] < (SELECT B.[START] AS CORRECT_DATE 
              FROM dbo.TANK B 
         WHERE B.[CURRENT] = 1 
         AND A.NAME = B.NAME 
         AND A.TYPE = B.TYPE 
           AND A.COVER = B.COVER) 

我曾尝试以下,但它不承认别名WHERE子句中:

SELECT A.NAME, MAX(A.[START]), (SELECT B.[START] AS CORRECT_DATE 
              FROM dbo.TANK B 
         WHERE B.[CURRENT] = 1 
         AND A.NAME = B.NAME 
         AND A.TYPE = B.TYPE 
           AND A.COVER = B.COVER) as subvalue 
FROM dbo.TANK A 
WHERE A.[CURRENT] = 0 AND A.[END] < subvalue 

回答

2

你为什么不使用连接?相关的子查询是应该尽可能避免的性能杀手。

SELECT A.NAME 
    , MAX(A.[START]) 
    , B.[START]           
FROM dbo.TANK A 
JOIN dbo.TANK B 
    ON A.NAME = B.NAME 
    AND A.TYPE = B.TYPE 
    AND A.COVER = B.COVER AND B.[CURRENT] = 1 
WHERE A.[CURRENT] = 0 AND A.[END] < B.[START] 
    GROUP BY A.NAME, B.[START]; 
+0

伟大的解决方案!不仅仅是5分钟内的正确答案,还有一个比我的尝试还要好!谢谢! –