如何才能一组被转换为一个表自连接

问题描述:

如:如何才能一组被转换为一个表自连接

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

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'放入一个新的(父组)表中,并为子组创建另一个表。然后用规格化的表运行查询以表明它对性能更好(比这种非规范化的情况更难以找到索引并使其工作)。 –

什么

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