我有一个这样的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?
我必须找到一个更有效的解决方案来运行此查询。
非常感谢。
答案 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中没有关联的行。)