SQL:改进选择查询

时间:2017-02-10 15:22:24

标签: c# sql sql-server razor sql-server-ce

我有理由相信这段代码可以做得更好,并且可能在查询开始时做更多的工作?

我会试着解释一下。

我的数据库中的每一行都有{1}}的1,2或3值,然后还有exercise的数字可以是任意数字,但在此代码中我选择只关心对于1-12,所以此代码选择具有最高值rep的行(这是一列并且每行都有一个值),其中kilograms为1且exercise为1,然后是2和3等等,最多12个,然后将rep更改为2,再从1-12开始选择最上面的exercise行。

这有意义吗?

kilograms

我使用SQL Server Compact,它不是MVC项目。

2 个答案:

答案 0 :(得分:3)

您可以使用Group ByMAX汇总功能,只使用一个查询选择您感兴趣的所有行。

SELECT t.kg, t.rep, t.date
FROM Test t
INNER JOIN 
    (SELECT MAX(kg) as kg, exercise, rep
    FROM Test
    WHERE exerVariName = 'Comp'
    GROUP BY exercise, rep) i
ON t.exercise = i.exercise AND t.rep = i.rep AND t.kg = i.kg
WHERE t.exerVariName = 'Comp'

内部查询仅执行一次。它会找到组标识符(exercise, rep)元组和相应的最大kg组值。 然后内部查询与Test表连接,以获得行的“内容”(在您的情况下只有一个额外的字段date)。

整体表现最佳。

您只需要迭代此查询的结果。

请参阅this topic

编辑:

排除具有相同(rep, exercise)的多个kg记录(与OP的循环几乎相同)

SELECT kg, rep, exercise, MAX(date) 
FROM 
    (SELECT t.kg, t.rep, t.exercise, t.date
    FROM Test t
    INNER JOIN 
        (SELECT MAX(kg) as kg, exercise, rep
        FROM Test
        WHERE exerVariName = 'Comp'
        GROUP BY exercise, rep) i
    ON t.exercise = i.exercise AND t.rep = i.rep AND t.kg = i.kg
    WHERE t.exerVariName = 'Comp') t
GROUP BY t.kg, t.rep, t.exercise

答案 1 :(得分:0)

SELECT kg, rep, date, exercise, rep FROM Test test1 WHERE rep = (SELECT TOP 1 test2.rep FROM Test test2 WHERE test2.exercise = test1.exercise AND test2.rep = test1.rep ORDER BY kg DESC) GROUP BY exercise, rep

循环显示这些结果并显示它们。