2014-10-05 45 views
1

我正在構建查詢以顯示基於他們參與了多個事件的事實的運動員姓名。顯示參與一個以上事件的運動員姓名的SQL查詢

爲此,我不得不使用2個表所示:

CREATE TABLE ATHLETE(
ATHLETEID CHAR(4), 
ATHLETEFIRSTNAME VARCHAR2(20), 
ATHLETELASTNAME VARCHAR2(20), 
ATHLETEDOB DATE, 
REPCOUNTRY VARCHAR2(12), 
COACHID CHAR(4), 
CONSTRAINT ATHLETE_PK PRIMARY KEY(ATHLETEID), 
CONSTRAINT ATHLETE_FK1 FOREIGN KEY(COACHID) REFERENCES COACH(COACHID)); 

CREATE TABLE RESULTS(
EVENTID CHAR(4), 
ATHLETEID CHAR(4), 
RANK NUMBER(1), 
CONSTRAINT RESULTS_PK PRIMARY KEY(EVENTID,ATHLETEID), 
CONSTRAINT RESULTS_FK1 FOREIGN KEY(EVENTID) REFERENCES EVENTSCHEDULE(EVENTID), 
CONSTRAINT RESULTS_FK2 FOREIGN KEY(ATHLETEID) REFERENCES ATHLETE(ATHLETEID)); 

使用下面的查詢我能夠展現ATHLETEID已參與多個事件的,正是我掙扎是也顯示運動員的姓名,因爲它位於不同的表格中。我很確定我應該使用子查詢,但是我不確定如何構建它。

SELECT A.ATHLETEID FROM RESULTS A GROUP BY A.ATHLETEID HAVING COUNT(*) > 1;

提前感謝!

回答

2

ShoutCase SQL不談,你需要通過所有的非聚集列加盟回運動員,然後組,像這樣(注我已經關掉你的別名,調整到表名):

SELECT a.ATHLETEID, a.ATHLETEFIRSTNAME, 
     a.ATHLETELASTNAME, COUNT(r.EVENTID) as NumEvents 
FROM RESULTS r 
    INNER JOIN ATHLETE a 
    ON r.ATHLETEID = a.ATHLETEID 
GROUP BY a.ATHLETEID, a.ATHLETEFIRSTNAME, a.ATHLETELASTNAME 
HAVING COUNT(r.EVENTID) > 1; 
+1

中工作如果我可以+10的ShoutCase評論,我會...... – Charleh 2014-10-05 08:58:05

+0

@Richard:即使任何運動員分享一個名字,AthleteId會有所不同,因此它仍然可以工作。 – SylvainL 2014-10-05 09:04:49

+1

@StuartLC&SylvainL你當然是對的(評論刪除) – Richard 2014-10-05 09:07:39

2

只需使用帶有計數加入(子查詢不需要

SELECT A.ATHLETEID,ATH.ATHLETEFIRSTNAME FROM RESULTS A 
JOIN ATHLETE ATH 
ON ATH.ATHLETEID =A.ATHLETEID 
GROUP BY A.ATHLETEID,ATH.ATHLETEFIRSTNAME HAVING COUNT(*) > 1; 
+0

不會在SQL Server中運行:因爲它不是在聚合函數中包含「列ATHLETE.ATHLETEFIRSTNAME'在選擇列表中無效或GROUP BY子句。' (或者關閉:在不同的數據庫中檢查) – Richard 2014-10-05 09:05:39

+0

@Richard感謝更新不會在 – 2014-10-05 09:13:55

1

如果名稱是唯一的,你可以通過名稱組爲好,但一般不會是真實的,所以一個子查詢簡單:

select A.ATHLETEID, a.ATHLETEFIRSTNAME, ATHLETELASTNAME 
from ATHLETE a 
where 1 < (select count(1) from RESULTS r where r.ATHLETEID = a.ATHLETEID) 
0

一個子查詢另一個例子是:

select A.ATHLETEID, a.ATHLETEFIRSTNAME, a.ATHLETELASTNAME 
from ATHLETE a 
where A.ATHLETEID in (SELECT R.ATHLETEID FROM RESULTS R GROUP BY R.ATHLETEID HAVING COUNT(*) > 1) 
相關問題