所以这就是我的尝试:
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怎么办?我该怎么写呢,或者这也适合呢?
答案 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
通过在FNAME
和LNAME
上设置索引,您也会受益匪浅,但我怀疑这与您的练习考试有关。