2015-10-21 128 views
1

所以这是我曾尝试:写一个查询来找到具有相同名字和姓氏的学生?

SELECT A.STUDENT_ID 
FROM STUDENT A, STUDENT B 
WHERE A.FNAME=B.FNAME 
    AND A.LNAME=B.LNAME 
    AND A.STUDENT_ID!=B.STUDENT_ID; 

这里是学生表列:

STUDENT_ID primary key 
FNAME 
LNAME 

看来工作。但根据练习考试,它值得15分,所以我不确定它是否完全正确。如果有更多的两名学生拥有相同的fname和lname会怎么样?我会如何写它或为此做这项工作?

回答

1

为了避免Cartesian product(这是你与多个FROM条款得到),这将创建重复的行,我会使用一个EXISTS条款

SELECT a.STUDENT_ID, a.FNAME, a.LNAME 
FROM STUDENT a WHERE EXISTS (
    SELECT 1 FROM STUDENT b 
    WHERE a.FNAME = b.FNAME 
    AND a.LNAME = b.LNAME 
    AND a.STUDENT_ID <> b.STUDENT_ID 
); 

http://sqlfiddle.com/#!9/75fd6/3

FNAMELNAME上都有索引,你也会从中受益匪浅,但我怀疑这与你的考试有关。

+0

好吧,所以遇到了另一个问题,我被困在如何使一个基于功能的索引来提高性能。似乎没有任何功能来建立索引。 –

1

你有什么技术上的工作。但是,每名匹配学生返回的行数将等于n - 1,其中n是与匹配的学生姓名相同的学生人数。

要解决此问题,请在查询中使用DISTINCT子句。

SELECT DISTINCT A.STUDENT_ID 
FROM STUDENT A, STUDENT B 
WHERE A.FNAME=B.FNAME 
    AND A.LNAME=B.LNAME 
    AND A.STUDENT_ID!=B.STUDENT_ID; 
相关问题