2014-02-25 31 views
-1

我不得不採取類似的代碼如下:你如何使用左連接而不是分組?

SELECT courseId, termId, firstName, lastName 
FROM (
    SELECT s.courseId, s.termId, t.teacherId 
    FROM Teaches t, Section s 
    WHERE s.id = t.sectionId 
    GROUP BY s.termId, s.courseId 
    HAVING COUNT(DISTINCT t.teacherId) = 1 
) Teach, Person p 
WHERE p.id = teacherId 
ORDER BY courseId, termId; 

,並與1子查詢,通過的不羣,並且僅使用連接沒有聚合函數(內連接,左連接,等等)把它變成一個MySQL聲明。我一直在努力幾個小時,但我無法找到一種不按功能使用組的方法。任何有識之士將不勝感激。

+0

用一點咖啡,一切皆有可能。嗯,但誠實地嘗試穿上紙。一些P&P - 紙和鉛筆,可能會幫助 – Coffee

+0

什麼是'sectionId',是'Teaches'上的一列還是'Section'上的一列? – bjhaid

+0

我將代碼稍微改了一點以clairfy @bjhaid – user2256498

回答

3

我相信這會返回一個等價的結果集,只使用JOIN和只有一個子查詢。 (我還沒有測試過。)

我解決這個問題的一般方法是使用一個允許的子查詢,並使用NOT EXISTS謂詞來測試「匹配」行的存在性。

SELECT s.courseId 
     , s.termId 
     , p.firstName 
     , p.lastName 
    FROM Section s 
    JOIN Teaches t 
    ON t.sectionID = s.id 
    LEFT 
    JOIN Person p 
    ON p.id = t.teacherId 
    WHERE NOT EXISTS 
     (SELECT 1 
      FROM Section c 
      JOIN Teaches d 
       ON d.sectionId = c.id 
      WHERE c.courseId = s.courseId -- match (as equivalent to group by) 
      AND c.termId  = s.termID  -- match (as equivalent to group by) 
      AND c.id  <> s.id   -- but not the same row (count=1) 
      AND d.teacherId <> t.teacherId -- but not the same row (count=1) 
     ) 
    ORDER 
    BY s.courseId 
     , s.termId 

在不相關子查詢EXISTS謂詞正在尋找一個匹配行,但當然,該行本身將匹配,所以我們需要將它排除在外。

我可能沒有理解哪些列在哪些表中,所以我可能無法工作。 (限定查詢中的所有列引用都是1)對讀者的幫助,可能不知道哪些列位於哪個表中,以及2)避免查詢被「不明確的列」異常無意中「破壞」,何時將相同名稱的列添加到查詢中涉及的其中一個表中。

我已經對Section中的id列的唯一性和Teaches中的teacherId列做了一些假設。

(的該部分並教結合使得它有點醜陋的事實,這將是更容易地看到,如果它是一個單一的表。)

SELECT t 
    FROM mytable t 
WHERE NOT EXISTS 
     (SELECT 1 
      FROM mytable d 
      WHERE d.somecol = t.somecol -- a match! 
      AND d.id  <> t.id  -- not the same row! 
     ) 

實際上,我認爲這可能與抗來解決 - 連接模式,根本不使用任何子查詢,但是連接在一起的三個表(Section,Teach和Person)使我很難圍繞這一點來包裝我的大腦。

+0

這有助於一噸,謝謝 – user2256498

+0

我實際上並沒有看到原來的子查詢是如何工作的,因爲選定的列的teacher_id不在列中。 – zinking