Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在SQL Server中选择-子查询的备选方案_Sql_Sql Server_Select_Subquery - Fatal编程技术网

在SQL Server中选择-子查询的备选方案

在SQL Server中选择-子查询的备选方案,sql,sql-server,select,subquery,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) 是否有其他方法可以使用子查询?可以使用JOIN吗 我必须找到一个更有效的解决方案来运行此查询 非常感谢。是的,您可以使用加入: SELECT T1.COD, T1.NAME,

我有这样一个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) 
是否有其他方法可以使用子查询?可以使用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

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

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
在连接外部进行分组会更改查询的语义。特别是,每个COD/名称只返回一行,即使T1中可能有重复的行。这可能是可取的。但是,原始查询将包含重复的查询


另外,为什么在TAB1上有一个NOLOCK,而在TAB2上没有呢?

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


按COD和名称分组的解决方案是最差的解决方案。具有子查询的解决方案与外部应用相同。带有外部应用的解决方案或多或少是一个很好的解决方案,使用交叉应用更好,但在这种情况下,您应该确保TAB1中没有在TAB1中没有关联行的行。

子查询很好,因为没有它,您必须左键选择maxdata,code from dbo.tab2 group by code t2 on t1.code=t2.code
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