SQL语句未选择

时间:2017-03-23 12:44:13

标签: c# sql sql-server

我在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;

当我只有一个解决方案时,这个工作正常,但是当我有多个解决方案时,它没有。

6 个答案:

答案 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个结果。有两个解决方案 - 考虑使用两者。

  1. 通过在ORDER BY...RANK() OVER (ORDER BY rank DESC, CreatedDate DESC
  2. 中添加第二列,选择一个决胜局列 - 可能是最新的一栏
  3. 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;