SQL Server中的SELECT - SUBQUERY的替代方法

时间:2012-06-27 16:18:30

标签: sql sql-server select subquery

我有一个这样的SELECT语句:

SELECT 
T1.COD,
T1.NAME, 
(SELECT MAX(T2.DATA)
  FROM dbo.TAB2 T2
  WHERE T2.COD = T1.COD) AS ENDDATA
FROM dbo.TAB1 AS T1 WITH (NOLOCK) 

有没有其他方法可以使用SUBQUERY?是否可以使用JOIN?

我必须找到一个更有效的解决方案来运行此查询。

非常感谢。

4 个答案:

答案 0 :(得分:2)

要返回与原始查询相同的结果,您需要以下内容:

SELECT T1.COD, T1.NAME, s.ENDDATA
FROM dbo.TAB1 T1 WITH (NOLOCK)  left outer join
     (SELECT t2.cod, MAX(T2.DATA) as EndData
      FROM dbo.TAB2 T2
      group by T2.COD
     ) s
     on t1.cod = s.cod

在联接外部执行组会更改查询的语义。特别是,即使T1中可能存在重复项,每个COD / NAME也只返回一行。这可能是可取的。但是,您的原始查询将具有重复项。

另外,为什么TAB1上有NOLOCK而TAB2上没有?

答案 1 :(得分:0)

是的,你可以使用JOIN:

SELECT 
   T1.COD,
   T1.NAME, 
   MAX(T2.DATA) AS ENDDATA
FROM dbo.TAB1 AS T1 WITH (NOLOCK) 
JOIN dbo.TAB2 T2 WITH (NOLOCK) -- Assumed
  ON T2.COD = T1.COD
GROUP BY
   T1.COD,
   T1.NAME

答案 2 :(得分:0)

SELECT   T1.COD,
         T1.NAME, 
         MAX(T2.DATA)
FROM     TAB1 AS T1
JOIN     TAB2 AS T2
ON       T2.COD = T1.COD
GROUP BY T1.COD,
         T1.NAME;

答案 3 :(得分:0)

为什么你不想使用subselect?您可以将其替换为外部应用语句(从我的角度看起来更好),但在大多数情况下,您将获得相同的执行计划。是的,实际上它取决于你的索引(我假设你在TAB2表中有COD索引)和数据(我假设两个表中的行数或多或少都很大,TAB2中的行数肯定大于TAB1中的行数) )。

使用COD和NAME进行分组的解决方案是最糟糕的解决方案。子查询的解决方案与外部应用相同。使用外部应用的解决方案或多或少是一个好的解决方案(甚至更好地使用交叉应用,但在这种情况下,您应该确保TAB1中没有行而TAB1中没有关联的行。)