2014-10-05 46 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) 
相关问题