SQL Order By в пределах Order By - PullRequest
       10

SQL Order By в пределах Order By

2 голосов
/ 29 ноября 2010

Итак, у меня есть две таблицы «Вопросы и ответы», соединенные таблицей отношений «многие ко многим», «Вопросы и ответы».У вопросов есть столбец Сортировка, который позволяет мне контролировать способ их отображения пользователю, а у Вопросов-ответов также есть столбец сортировки, который позволяет мне контролировать порядок ответов на каждый Вопрос.Моя проблема в том, что я пытаюсь написать SQL-запрос, который выберет все Вопросы и их ответы, упорядоченные сначала по Question.Sort, а затем по QuestionsAnswers.Sort.Оба столбца сортировки могут иметь значение NULL, и целые числа в этих столбцах должны иметь приоритет над NULL.

Я могу сделать так, чтобы Order By Questions.Sort работал нормально, но как только я добавлю во второй столбец сортировки, он будет ошибочным.Например, если у Вопроса есть Sort = 0, означающий, что это должен быть первый отображаемый Вопрос, но не имеет никаких предпочтений для его Ответов, он будет упорядочен ниже строки QuestionAnswers, которая имеет Questions.Sort = null и QuestionsAnswers.Sort = 0.

Любые советы или мысли, если это даже выполнимо, были бы великолепны.

edit:

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;

Ответы [ 2 ]

5 голосов
/ 29 ноября 2010
ORDER BY COALESCE(Questions.Sort, 999999999), COALESCE(Answers.Sort, 999999999)
2 голосов
/ 29 ноября 2010

Из того, что я вижу, что-то подобное должно сработать. Если я что-то не пропустил.

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 
...