在SQL Server中选择-子查询的备选方案
我有这样一个SELECT语句:在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
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