SQL - мне нужно ограничить строки, возвращаемые из второй таблицы? - PullRequest
1 голос
/ 04 августа 2011

Я использую SQL Server 2008.

У меня есть таблица вопросов и у меня есть таблица ответов.Таблица вопросов содержит QuestionID, Вопрос и Положение (порядок).Таблица ответов содержит ответы и answerID.На каждый вопрос можно ответить несколько раз.

Наши консультанты должны видеть ТОЛЬКО самый последний ответ, поэтому мы сортируем по AnswerID DESC.

Наши администраторы должны иметь возможность видеть историю каждого ответа.Вот почему мы не удаляем ответы.

Мой запрос сейчас выглядит так:

 SELECT   Q.*, A.*
 FROM     Questions Q 
          LEFT JOIN Answers A 
               ON Q.QuestionID = A.QuestionID
 WHERE      FranchisorID = 10   
 ORDER BY   Q.Position, A.AnswerID DESC

Мой набор результатов с запросом выше выглядит так:

QuestionID - Question - AnswerID - Answer - 

 1 what is your fave color? 3 Blue
 1 what is your fave color? 2 Green
 1 what is your fave color? 1 Red
 4 What year is this? 5 2011
 4 What year is this? 4 2010

Мне нужно, чтобы мой набор результатов выглядел так:

 1 what is your fave color? 3 Blue
 4 What year is this? 5 2011

Можете ли вы настроить мой маленький запрос для меня?

Ответы [ 3 ]

2 голосов
/ 04 августа 2011

Один из вариантов будет

  • добавить ROW_NUMBER
  • PARTITION it by QuestionID
  • ORDER BY DESC на AnswerID, чтобы вернуть только самые большие ответы ID
  • возвращает строки, где rn = 1

Оператор SQL

SELECT  *
FROM    (
            SELECT  Q.QuestionID
                    , Q.Question
                    , A.AnwerID
                    , A.Answer
                    , rn = ROW_NUMBER() OVER (PARTITION BY QuestionID ORDER BY AnswerID DESC)
            FROM    Questions Q 
                    LEFT JOIN Answers A ON Q.QuestionID = A.QuestionID
             WHERE  FranchisorID = 10
        ) r
WHERE   r.rn = 1                            
1 голос
/ 04 августа 2011
  • Используйте CTE для получения последнего идентификатора ответа
  • Используйте INNER JOIN для CTE, чтобы отфильтровать результаты.

    WITH LatestAnswer AS
    (
        SELECT  QuestionID,
                MAX(AnswerID) AS LatestAnswerID
        FROM    Questions
        INNER JOIN Answers ON Answers.QuestionID = Questions.QuestionID
        GROUP BY QuestionID
    )
    
    SELECT      Q.*, A.*
    FROM        Questions Q 
    LEFT JOIN   Answers A ON Q.QuestionID = A.QuestionID
    INNER JOIN  LatestAnswer ON LatestAnswer.LatestAnswerID = Answers.AnswerID
    WHERE       FranchisorID = 10   
    ORDER BY    Q.Position, A.AnswerID DESC
    
0 голосов
/ 04 августа 2011
 SELECT   Q.*, A.*
 FROM     Questions Q 
   LEFT JOIN Answers A 
   ON A.AnswerId in 
     (select top 1 a2.AnswerId from Answers a2 
      where a2.QuestionId=Q.QuestionId order by a2.AnswerId DESC)
 WHERE      FranchisorID = 10   
 ORDER BY   Q.Position
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...