2016-06-18 140 views
0

我是SQL新手,希望能在這裏找到一些幫助。 英語不是我的母語,所以如果事情似乎不清楚,隨意問!SQL:篩選出現多次的條目

像主題名稱暗示我想過濾從一個表不止一次的表(字符串)。

我的代碼如下所示:

SELECT DISTINCT characterid, firstname, lastname, courseid 
FROM Teaches 
NATURAL JOIN Character 
GROUP BY characterid, firstname, lastname, courseid 

,這讓我這個:

enter image description here

任務是過濾掉大家誰教超過1個療程。在這種情況下,它將是Snape和Quirrell。 我試了一下計數

HAVING count(characterid) > 1 

但這並沒有奏效。如果有人能幫助我,也許可以解釋爲什麼這個計數不起作用,我會很高興。先謝謝你!

編輯:如果我說「過濾器」,那麼我的意思是我想它作爲結果表。因此,最終我得到一個與2行 1)characterid Severus Snape 2)characterid Quirinus Quirrell

對不起,因爲如此不清楚。此外,我僅在SELECT語句中包含courseid,以便更清楚地瞭解誰教授多個課程。決賽桌應該只有三列「characterid」,「firstname」和「lastname」。編輯2:這裏是數據庫的結構。也許我是完全錯誤的,因此可幫助你們:結構

enter image description here

+0

哪些DBMS您使用的? –

回答

1

爲什麼計數沒有工作?因爲你組courseid,所以它只能算爲每個courseid,不是每個或CharacterId數所有課程

所以,你應該將其更改爲

SELECT 
    characterid, firstname, lastname 
FROM 
    Teaches 
NATURAL JOIN 
    Character 
GROUP BY 
    characterid, firstname, lastname 
HAVING 
    COUNT(*) > 1; 

而且我建議你使用INNER JOIN代替NATURAL JOINNATURAL JOIN不是標準的,不乾淨的,對編碼器不可見(其他人不知道你想加入哪些列,所以它不可讀)

而且根據你的評論,我假設你想要得到所有教任何一年,任何職位超過1門課程。

因此,對於你的情況,你應該使用(如果你想在任何學校拿到然後在子查詢中刪除t.schoolid):

SELECT 
    characterid, firstname, lastname 
FROM 
    (
    SELECT DISTINCT 
     c.characterid, c.firstname, c.lastname, t.courseid, t.schoolid 
    FROM 
     Teaches t 
    INNER JOIN 
     Character c 
    ON 
     t.characterid = c.characterid 
    ) 
GROUP BY 
    characterid, firstname, lastname 
HAVING 
    COUNT(*) > 1; 
+0

你好!感謝您的快速反饋和提示。我試着按照你的建議,結果是這[表2](http://i.imgur.com/9yRyE9d.png)。當我將它與courseid分組時,得到的結果是一樣的:(確保我也將它作爲解決方案上傳到我們的練習服務器上,並且反饋是否定的 – djaru

+0

我在第一篇文章中包含了該結構,也許我開始完全錯誤[結構](http://i.stack.imgur.com/R3LF6.png) – djaru

+0

@djaru看起來問題出在你的表中,你能運行這個查詢並顯示結果嗎?:'SELECT * FROM teachhes t INNER JOIN字符c ON t.characterid = c.characterid WHERE c.characterid = 5;'根據你的回覆,這個查詢必須返回多於1行 –