【问题标题】:SQL Order By within Order By排序依据中的 SQL 排序依据
【发布时间】:2010-11-29 20:46:07
【问题描述】:

所以我有两个表,问题和答案,由多对多关系表 QuestionsAnswers 连接。问题有一个排序列,允许我控制它们如何显示给用户,并且 QuestionsAnswers 也有一个排序列,允许我控制每个问题的答案的顺序。我的问题是我正在尝试编写一个 SQL 查询,它将选择首先按 Question.Sort 然后按 QuestionsAnswers.Sort 排序的所有问题及其答案。两个排序列都可以为空,并且这些列中的整数应优先于空值。

我可以让 Order By Questions.Sort 正常工作,但是一旦我添加到第二个排序列中,它就会出错。例如,如果一个问题的 Sort = 0 意味着它应该是显示的第一个问题,但对其答案没有任何偏好,它将在具有 Questions.Sort = null 和 QuestionsAnswers.Sort = 0 的 QuestionsAnswers 行下方排序.

如果这甚至可行,任何提示或想法都会很棒。

编辑:

SELECT
    Q.Id AS QuestionId,
    Q.Name AS Question,
    A.Id AS AnswerId,
    A.Text AS Answer
FROM
    dbo.Questions AS Q
INNER JOIN
    dbo.QuestionsAnswers AS QA
        ON Q.Id = QA.QuestionId
INNER JOIN
    dbo.Answers AS A
        ON QA.AnswerId = A.Id
ORDER BY
    ISNUMERIC(Q.Sort) DESC,
    Q.Sort,
    Q.Id,
    A.Text;

【问题讨论】:

  • 分享您的实际 SELECT 语句,并给出它返回的行的示例,足以说明问题。
  • ORDER BY 接受多个以逗号分隔的列名。
  • 是的,我的问题是,由于任何一列都可以为空,它们会在排序中相互跳过。我想完全按 Questions.Sort 排序,然后在每个子组中按 QuestionsAnswers.Sort 排序
  • 在列上使用coalescenull 列提供有效(大)值。您当前对isnumeric 的使用使所有非空值都等于1,这可能不是您想要的。

标签: sql select sql-order-by


【解决方案1】:
ORDER BY COALESCE(Questions.Sort, 999999999), COALESCE(Answers.Sort, 999999999)

【讨论】:

  • 非常感谢,这行得通,但它似乎有点 hacky。我的意思是实际上可能永远不会有这么高的排序值,我什至可以限制用户可以为排序列输入的内容以确保这一点,但由于某种原因我仍然觉得使用它很脏。
  • @rpf3:同意,但这是工程的本质(与计算机科学相反)。有时最好用嘴里的口香糖堵住泄漏点。您可能还认为技术上“正确”的解决方案 ORDER BY CASE WHEN Questions.Sort IS NULL THEN 1 ELSE 0 END, Questions.Sort, Case WHEN Answers.Sort IS NULL THEN 1 ELSE 0 END, Answers.Sort 看起来比 hack 更 hack。
【解决方案2】:

据我所知,这样的事情应该可以解决问题。除非我错过了什么。

select questions.*, answers.* 
from questionsanswers qa
inner join questions
    on questions.idquestions = qa.questionid
inner join answers
    on answers.idanswers = qa.answerid
order by isnull(questions.sort), questions.sort, isnull(qa.sort), qa.sort 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-09-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-26
    • 1970-01-01
    相关资源
    最近更新 更多