如何才能一组被转换为一个表自连接
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);
但是,这并不为我做了...
在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
我喜欢这个。我想不出还有哪些可以被索引的东西,在这种情况下会有所帮助。就个人而言,虽然这样做感觉非常错误,但我认为应该更改表格的设计,使父组和子组在单独的列中。或者甚至更好的是,在他们自己的表格中索引子组以及引用他们的父组...家庭作业练习总是让我烦恼。 :) – Chris
是的,将列拆分为两个(组,子组)在任何情况下肯定会更好。实际上,你可以将我的'(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)
也许从一个子查询计数是一个更快索引
因为这个被标记为功课,你需要出示您到目前为止尝试什么。当你遇到困难时,我们很乐意提供帮助,但通常不会提供完整的作业问题答案。 –
为什么你不想使用'group by'。它看起来是完美的东西用于这项工作。 –
,因为老师是个笨蛋,并希望我们使用索引来优化愚蠢的查询,因为他没有想到使用聚合查询。我们必须证明使用索引会改进我们的查询。我的第一个想法是使用GROUP BY,但索引没有改进,所以我不会得到满分。 – BobTurbo