我在C#项目中使用SQL Server进行故障排除程序,我有一个包含ID,Question,QuestionId,Solution和Rank的表。我希望有一个问题的多个解决方案,程序将选择排名最高的解决方案,这个解决方案只选择最高数字,每次正确时都会增加。为此,我有以下SQL语句:
sql = "SELECT Solution FROM dbo.Questions WHERE Rank=(SELECT MAX(Rank) FROM
dbo.Questions) AND QuestionId =" + questionId;
当我只有一个解决方案时,这个工作正常,但是当我有多个解决方案时,它没有。
答案 0 :(得分:6)
您需要正确参数化您的查询。 Bobby Tables: A guide to preventing SQL injection
sql = "SELECT Solution FROM dbo.Questions q WHERE Rank=(SELECT MAX(Rank) FROM
dbo.Questions i where i.QuestionId = q.QuestionId) AND q.QuestionId =" + questionId;
这可确保子查询返回的max(rank)
是您要查询的max(rank)
解决方案的QuestionId
。
如果您只想要一个Solution
:
select top 1 Solution
from dbo.Questions q
where QuestionId = @QuestionId
order by [Rank] desc
答案 1 :(得分:4)
您正在选择所有解决方案的最高排名,并寻找具有该排名的指定问题的解决方案。
从头开始 - 在CTE中选择可能的解决方案
with solutions as(
SELECT Solution, Rank FROM dbo.Questions WHERE QuestionId = @questionId
)
... more to come
鉴于此,您可以使用ranking function按排名对所有可能的解决方案进行排名,并选择排名最高的解决方案(该句中的排名过多!)
with solutions as(
SELECT Solution, Rank() OVER (ORDER BY Rank DESC) as rank
FROM dbo.Questions WHERE QuestionId = @questionId
)
SELECT * FROM solutions WHERE rank = 1
这不包括具有相同等级的2个解决方案 - 如果2具有相同等级,则您将从查询中获得2个结果。有两个解决方案 - 考虑使用两者。
ORDER BY
(...RANK() OVER (ORDER BY rank DESC, CreatedDate DESC
)TOP 1
投入最终选择(SELECT TOP 1 * FROM solutions WHERE rank = 1
)答案 2 :(得分:0)
该记录的MAX排名可能没有您在AND QuestionId =“+ questionId;
中给出的问题答案 3 :(得分:0)
您可以尝试这个,我已经将CTE查询之外的where子句留下了,这样您也可以使用查询来获取每个问题的完整列表及其最大排名(如果您省略了QuestionId过滤器):< / p>
with [ctreMaxSolution] as
(
select [QuestionId]
, max([Rank]) as [Rank]
from [dbo].[Questions]
group by [QuestionId]
)
select *
from [dbo].[Questions] as [q]
inner join [cteMaxSolution] as [cms] on [q].[QuestionId] = [cms].[QuestionId]
and [q].[Rank] = [cms].[Rank]
where [q].[QuestionId] = @questionId;
我在那里使用了一个SQL Server变量,但您可以从中创建一个存储过程,或者将其转换为您问题中的即席查询,完全取决于您。
答案 4 :(得分:0)
首先按“questionId”进行过滤,然后按“排序依据”排名。
试试这个:
SELECT TOP 1 q.solution FROM dbo.Questions q WHERE q.QuestionId = @QuestionId
ORDER BY q.Rank desc
希望这有帮助!
答案 5 :(得分:-2)
请按以下方式修改您的查询。
sql = "SELECT Solution FROM dbo.Questions WHERE Rank in (SELECT MAX(Rank) FROM
dbo.Questions) AND QuestionId =" + questionId;
这里我修改了&#34; in&#34;而不是&#34; =&#34;