2015-10-21 48 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;