2013-02-12 96 views
0

大家好我寫了下面的查詢結果從3個表(合併tblQuestions,tblReplies,tblTechnology和如下與SQL子查詢

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顯示所需要的結果的SQL查詢在某些領域,其中數據爲存在

enter image description here

代替的NULL我需要拉出一些數據,其存在於tblQuestions,也是否有可能減少查詢。

從OP的評論:

我試圖用replycount and viewcount沿拉出第q uestiontitle,username,questionid from tblquestions和張貼基於QuestionID和技術的ID問題,從tblreplys

+3

你想用這個查詢來實現什麼?您的查詢不容易,難以猜測。你能發佈樣本數據和預期結果嗎?可能有更簡單的方法來返回預期的結果,而不是使用如此多的子查詢 – 2013-02-12 14:18:07

+0

'rs',您可以檢查我的圖像以獲取我想要實現的內容 – Dotnet 2013-02-12 14:20:42

+1

您的圖像顯示預期數據,但不包含任何業務邏輯或條件。解釋你的問題以及你試圖用這個查詢來達到的目標。 – 2013-02-12 14:22:31

回答

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問題沒有答案,所以這些記錄salary問題的NULL。問題的RIGHT JOIN然後引入salary問題,並存在於tblr3結果集中,因爲它是RIGHT JOIN,即使tblr1對於此問題爲空。

LEFT JOIN再到技術是基於內tblr3QuestionID這是真正的QuestionIDtblr1。通過觀察在列的列表爲tblr3子查詢,如果你改變tblr1.QuestionIDtblr2.QuestionID這將確保懸而未決的問題加入到Technology

編輯:我覺得下面的查詢會給你的結果和簡單得多:

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 
+0

嗨'Tobsey'謝謝,但這給了我重複的結果 – Dotnet 2013-02-13 06:23:04

+0

@Dotnet如果'tblQuestions.QuestionID'或'tblTechnology.TechnologyID'沒有唯一的約束,這隻能給出重複。 – Tobsey 2013-02-13 10:16:24

0

解決了畢竟

select 
    FI.QuestionID, 
    FI.QuestionTitle, 
    FI.UserName, 
    FI.DatePosted, 
    FI.[date], 
    FI.RepliedName, 
    FI.viewCount, 
    FI.ReplyCount, 
    FI.ReplyMsg, 
    TT.TechID, 
    TT.TechName 
from 
    tblTechnology TT, 
    (select distinct 
     TQ.TechID, 
     TQ.QuestionID, 
     TQ.QuestionTitle, 
     TQ.UserName, 
     TQ.DatePosted, 
     TR.[date], 
     TR.UserName as RepliedName, 
     TQ.viewCount, 
     TQ.ReplyCount, 
     TR.ReplyMsg 
    from 
     tblQuestions TQ 
     LEFT OUTER JOIN tblReplies TR ON 
       TR.TechID=TQ.TechID 
      and TR.QuestionID = TQ.QUESTIONID 
      and TR.[date] in (select 
           MAX(TR.[date]) 
          from 
           tblReplies TR 
          group by 
           TR.QuestionID) 
    ) FI 
where 
    FI.TechID=TT.TechID 
and [email protected] 

enter image description here

以下
+0

雖然該查詢中有一個錯誤。如果問題1有兩個或兩個以上的答案,並且問題二有一個或多個答案,如果問題1的答案與問題2的最新答案具有相同的[tblReplies.Date]值,那麼問題1將得到多行 – Tobsey 2013-02-13 10:05:43

+0

即使我有更多問題的答案,我也沒有獲得多行 – Dotnet 2013-02-13 11:15:22

+0

我想如果兩個不同問題的兩個答案具有完全相同的[日期]值,我相信你會這樣做,前提是其中一個答案是它的最新答案題。我建議你測試一下,如果我錯了,那麼你應該沒問題。如果你只有3個答案,1,2和3以及兩個問題,1和2.如果問題1的答案是1,問題2的答案是3,那麼如果答案1和答案3在答案1中出現,你將得到重複同一時間。查看我創建的示例:http://www.sqlfiddle.com/#!3/cd6c6/1您可以看到第二季度的最新答案與Q1 – Tobsey 2013-02-13 11:38:53