2011-10-04 20 views
0

如:如何才能一組被轉換爲一個表自連接

employeeID | groupCode 
    1   red111 
    2   red111 
    3   blu123 
    4   blu456 
    5   red553 
    6   blu423 
    7   blu341 

我怎麼能指望那些在家長團體employeeIDs(如紅色或藍色,但有數量在實際表格中有更多的組),它們的組成員總數大於2(因此,在這個特定示例中,所有那些使用藍光的人)都排除在外。

展開:groupCode由一個父組(三個字母)組成,後跟子組的一些數字。

使用自連接,或者至少不使用group by語句。

到目前爲止,我有:

SELECT T1.employeeID 
FROM TABLE T1, TABLE T2 
WHERE T1.groupCode <> T2.groupCode 
    AND SUBSTR(T1.groupCode, 1, 3) = SUBSTR(T2.gorupCode, 1, 3); 

但是,這並不爲我做了...

+0

因爲這個被標記爲功課,你需要出示您到目前爲止嘗試什麼。當你遇到困難時,我們很樂意提供幫助,但通常不會提供完整的作業問題答案。 –

+1

爲什麼你不想使用'group by'。它看起來是完美的東西用於這項工作。 –

+0

,因爲老師是個笨蛋,並希望我們使用索引來優化愚蠢的查詢,因爲他沒有想到使用聚合查詢。我們必須證明使用索引會改進我們的查詢。我的第一個想法是使用GROUP BY,但索引沒有改進,所以我不會得到滿分。 – BobTurbo

回答

1

EMPLOYEE的前3個字符上添加索引。

然後試試這個:

SELECT ed.e3 
    , COUNT(*) 
FROM EMPLOYEE e 
    JOIN 
    (SELECT DISTINCT      
     SUBSTR(groupCode, 1, 3) AS e3 
     FROM EMPLOYEE 
    ) ed 
    ON e.groupCode LIKE CONCAT(ed.e3, '%') 
GROUP BY ed.e3 
HAVING COUNT(*) >= 3   --- or whatever is wanted 
+0

我喜歡這個。我想不出還有哪些可以被索引的東西,在這種情況下會有所幫助。就個人而言,雖然這樣做感覺非常錯誤,但我認爲應該更改表格的設計,使父組和子組在單獨的列中。或者甚至更好的是,在他們自己的表格中索引子組以及引用他們的父組...家庭作業練習總是讓我煩惱。 :) – Chris

+0

是的,將列拆分爲兩個(組,子組)在任何情況下肯定會更好。實際上,你可以將我的'(SELECT DISTINCT ...)ed'放入一個新的(父組)表中,併爲子組創建另一個表。然後用規格化的表運行查詢以表明它對性能更好(比這種非規範化的情況更難以找到索引並使其工作)。 –

0

什麼

SELECT substring(empshirtno, 1, 3), 
     Count(SELECT 1 from myTable as myTable2 
      WHERE substring(mytable.empshirtno, 1, 3) = substring(mytable2.empshirtno, 1, 3)) 
FROM MyTable 
GROUP BY substring(mytable2.empshirtno, 1, 3) 

也許從一個子查詢計數是一個更快索引

+0

試圖弄清楚,在oracle中的SQL,因爲它說缺少的表達式(只是刪除了AS,使其類似於oracle) – BobTurbo

+0

哦,對不起,不知道是甲骨文。這是一個MS SQL表達式。Oracle是否支持subquerys? –

+0

你也可以使用group by ...我認爲你應該可以將count移到子選擇中,然後在外面使用一個不同的名稱來刪除重複項。 – Chris

相關問題