0

こんにちは、私は次のクエリを作成して、3 つのテーブルの結果を結合し (tblQuestions,tblReplies,tblTechnology必要な結果を次のように表示します)

SELECT tech.DatePosted,
       tech.QuestionID,
       tech.TechnologyName,
       tblr3.TechID,
       tblr3.QuestionTitle,
       tblr3.UserName,
       tblr3.ReplyCount,
       tblr3.viewCount,
       tblr3.date,
       tblr3.RepliedName
FROM   (SELECT tblr1.DatePosted,
               tblr1.QuestionID,
               tblr2.TechID,
               tblr2.QuestionTitle,
               tblr2.UserName,
               tblr2.ReplyCount,
               tblr2.viewCount,
               tblr1.date,
               tblr1.RepliedName
        FROM   (SELECT tblq.DatePosted,
                       tblq.TechID,
                       tblq.QuestionID,
                       tblq.RepliedName,
                       tblq.QuestionTitle,
                       tblq.UserName,
                       tblq.ReplyCount,
                       tblq.viewCount,
                       tblq.date
                FROM   (SELECT q.DatePosted,
                               q.TechID,
                               q.QuestionID,
                               q.QuestionTitle,
                               q.UserName,
                               q.ReplyCount,
                               q.viewCount,
                               r.date,
                               r.UserName AS RepliedName
                        FROM   tblQuestions AS q, tblReplies AS r
                        WHERE  r.QuestionID = q.QuestionID
                               AND r.TechID = q.TechID
                               AND q.TechID = 1) AS tblq,
                                                 (SELECT   r.QuestionID,
                                                           max(r.date) AS PostedDate
                                                  FROM     tblReplies AS r
                                                  GROUP BY QuestionID) AS tblr
                WHERE  tblq.QuestionID = tblr.QuestionID
                       AND tblq.date = tblr.PostedDate) AS tblr1
               RIGHT OUTER JOIN
               (SELECT q.QuestionID,
                       q.TechID,
                       q.UserName,
                       q.viewCount,
                       q.ReplyCount,
                       q.QuestionTitle
                FROM   tblQuestions AS q
                WHERE  q.TechID = 1) AS tblr2
               ON tblr2.QuestionID = tblr1.QuestionID) AS tblr3
       LEFT OUTER JOIN
       (SELECT q.QuestionID,
               q.DatePosted,
               t.TechID,
               t.TechName AS TechnologyName
        FROM   tblTechnology AS t, tblQuestions AS q
        WHERE  q.TechID = t.TechID) AS tech
        ON tblr3.TechID = tech.TechID
           AND tblr3.QuestionID = tech.QuestionID
           AND tech.TechID = 1

これにより、期待どおりに次の結果が得NULLられますが、データが存在するいくつかのフィールドに到達します

ここに画像の説明を入力

NULLに存在するデータを引き出す必要がある代わりにtblQuestions、クエリを減らすこともできます。

OPコメントより:

テクノロジー IDに基づいて、その質問に対して投稿された最新の回答uestiontitle,username,questionid from tblquestionsとともに、q を引き出そうとしています。replycount and viewcountQuestionIDtblreplys

4

2 に答える 2

0

あなたのクエリは基本的にこれです:

SELECT
    blah
FROM
    (
        (SELECT
            blah
        FROM
            Questions
            INNER JOIN Replies ON QuestionID AND TechID) tblr1
        RIGHT JOIN Questions tblr2 ON QuestionID
    ) tblr3
    LEFT JOIN Technologies ON tblr3.tblr1.QuestionID = Technologies.QuestionID

有効なクエリではないことはわかっていますが、ご容赦ください。質問と回答tblr1の間に が含まれています。INNER JOINただし、質問に対する回答がないため、salaryこれらのレコードは質問NULLsalaryです。to Questions は次にRIGHT JOIN質問を導入し、それは結果セットsalaryに存在します。これは、この質問では null ですが、偶数であるためです。tblr3RIGHT JOINtblr1

then to テクノロジーは、実際にはfromであるwithinLEFT JOINに基づいています。サブクエリの列リストを見ると、これに変更すると、未回答の質問がテーブルに結合されることが保証されますQuestionIDtblr3QuestionIDtblr1tblr3tblr1.QuestionIDtblr2.QuestionIDTechnology

編集:次のクエリで結果が得られ、はるかに簡単になると思います:

WITH LatestReplies AS
(
  SELECT
    ReplyID,
    QuestionID,
    ReplyDate,
    UserName,
    Reply
  FROM
    (SELECT
      ReplyID,
      QuestionID,
      ReplyDate,
      UserName,
      Reply,
      ROW_NUMBER() OVER (PARTITION BY QuestionID ORDER BY ReplyDate DESC) ReplyOrder
    FROM
      tblReplies) A
  WHERE
    ReplyOrder = 1
)
SELECT
  tblQuestions.DatePosted,
  tblQuestions.QuestionID,
  tblTechnology.TechnologyName,
  tblQuestions.TechID,
  tblQuestions.QuestionTitle,
  tblQuestions.UserName,
  tblQuestions.ReplyCount,
  tblQuestions.ViewCount,
  LatestReplies.ReplyDate,
  LatestReplies.UserName RepliedName
FROM
  tblQuestions
  LEFT JOIN tblTechnology ON tblQuestions.TechID = tblTechnology.TechID
  LEFT JOIN LatestReplies ON tblQuestions.QuestionID = LatestReplies.QuestionID
于 2013-02-12T14:50:34.873 に答える