编写查询以查找具有相同名字和姓氏的学生?

时间:2015-10-21 03:12:54

标签: mysql oracle11g

所以这就是我的尝试:

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表格列:

STUDENT_ID primary key
FNAME
LNAME

似乎有效。但根据练习考试,它值15分,所以我不确定它是否完全正确。如果有两个学生拥有相同的fname和lname怎么办?我该怎么写呢,或者这也适合呢?

2 个答案:

答案 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;

答案 1 :(得分: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上设置索引,您也会受益匪浅,但我怀疑这与您的练习考试有关。