use*_*839 5 sql sql-server-2008
我原本写了以下内容
SELECT t1.TransactionNumber
FROM t1
JOIN
(
SELECT MAX(id) id
FROM t1
WHERE Period BETWEEN '01-11-2013' and '01-12-2014'
GROUP BY AccountNumber
) t2
on t1.id= t2.id
Run Code Online (Sandbox Code Playgroud)
但它太慢了.花了大约20秒,所以作为测试,我将其更改为以下内容
SELECT MAX(id) AS id
INTO #t2
FROM t1
WHERE Period BETWEEN '01-11-2013' and '01-12-2014'
GROUP BY AccountNumber
SELECT t1.id
FROM t1
JOIN #t2 t2
ON t1.id= t2.id
Run Code Online (Sandbox Code Playgroud)
第二个查询仅运行1秒.第二个查询使用PK密钥执行索引查找,而第一个键执行扫描.
注意:id是聚集在t1表上的主键.
你不能把所有的条件都放在ON部分吗?
SELECT t1.id
FROM t1
JOIN
(
SELECT id
FROM t1
WHERE <condition>
) t2
on t1.id = t2.id;
Run Code Online (Sandbox Code Playgroud)
被转化为
SELECT t1.id
FROM t1
JOIN t1 as t2
ON t1.id = t2.id AND <condition>
Run Code Online (Sandbox Code Playgroud)
更新:
检索每个组中的最后一条记录 该链接显示如何检索组中的最后一条记录。SQL如下
SELECT m1.*
FROM messages m1 LEFT JOIN messages m2
ON (m1.name = m2.name AND m1.id < m2.id)
WHERE m2.id IS NULL;
Run Code Online (Sandbox Code Playgroud)
你可以使用这个而不是group by