SQL UNION难以涉及具有不同列数和其他问题的查询

时间:2010-12-30 04:09:54

标签: sql derby

我是Toastmasters俱乐部的成员,并且负责安排哪些成员在每周会议中担任哪些角色。我正在编写一个小应用程序来帮助管理这个问题,我认为数据库可以帮助我确定哪个成员最应该在每个角色中服务。

为了简化问题,假设我的数据库有两个表... MEMBERROLE_PERFORMED

MEMBER
------
ID int
NAME varchar


ROLE_PERFORMED
--------------
MEMBER_ID int   (half of primary key, and also foreign key)
DATE date   (other half of primary key)
ROLE int   (0-11, mapped to an enumeration at the application layer)

我的目标是为每个角色类型编写一个SQL查询,它将为我提供:

  • MEMBER.NAME,适用于MEMBER表中的所有行

  • 第二列,包含与该成员和角色匹配的最新 ROLE_PERFORMED.DATE值...或者NULL(或其他一些占位符)该成员从未担任该角色

然后我可以按日期/占位符列进行排序,并按照谁没有执行该角色的时间最长的顺序分配角色。像这样:

ROLE     NAME    MOST_RECENTLY_PERFORMED
--------------------------------
1        John    <null>
1        Joe     2010-02-25
1        Bob     2010-09-14

我目前采取的方法是在一个UNION之间尝试一个SELECT ...来抓住那些已经执行过这个角色的成员,以及第二个从未执行过这个角色的SELECT抓取成员角色。像这样:

SELECT m.name, r.date FROM member m, role_performed r WHERE m.id = r.member_id and r.role = 1
UNION
SELECT m.name, (NULL?????) FROM member m, role_performed r WHERE (?????)

然而,这有三个问题,我希望有人可能有解决方案:

  • 第一个SELECT抓取所有成员执行该角色的日期,而不仅仅是最近的日期。

  • 第二个SELECT导致UNION失败,因为我无法找到可用于第二个日期列的可接受的占位符值... UNION' s要求每个查询返回相同数量的列。

  • 第二个WHERE子句超出了我有限的SQL技能。如何找到所有MEMBER行,其中的行与该成员和该角色匹配ROLE_PERFORMED行?请记住,可以仍然是ROLE_PERFORMED行与该成员匹配,而某些其他角色。

就像我说的那样,我不是世界上最伟大的SQL大师...所以如果我让它变得比它需要的更复杂,我会欢迎完全不同的方法。哎呀,我会欢迎一个更好的问题标题,以帮助有意义地呈现我所要求的!非常感谢。

5 个答案:

答案 0 :(得分:0)

这样的事情?

SELECT member.name , role_performed.date  FROM member
LEFT JOIN role_performed on role_perfomed.member_id = member.id
ORDER BY role_performed.date

答案 1 :(得分:0)

基本上你必须像这样使用CROSS JOIN:

选择     R.RoleId,     马克斯(R.Date)     M.Name 从     会员M. 内部联接 ( 选择     R1.RoleId,     R1.MemberId,     R.Date 从     Role_Performed R. 正确加入 ( 选择     R2.RoleId,     R1.MemberId,     R2.Date 从         Role_Performed R1 CROSS JOIN Role_Performed R2 )R1 ON R1.Date = R.Date AND R1.MemberId = R.MemberId ) R ON M.MemberId = R.MemberId GROUP BY R.RoleId,M.Name 订购     R.RoleId GO

答案 2 :(得分:0)

SELECT m.Name, oj.RoleID, MAX(r.Date)
FROM member m JOIN
    (
        SELECT m.MemberID, ar.RoleID
        FROM member m, (SELECT DISTINCT RoleID FROM role_performed) ar
    ) oj ON m.MemberID = oj.MemberID
    LEFT JOIN role_performed r ON r.MemberID = oj.MemberID AND r.RoleID = oj.RoleID
GROUP BY m.MemberID, r.RoleID

答案 3 :(得分:0)

其中一些查询非常接近我需要的所有内容,我非常感谢所有回复的人。然而,最终我最终在应用程序层中完成了我需要的一些逻辑。其中一个SQL查询可能会在更完整的数据库平台上完成工作,但是嵌入式Derby数据库可能不支持足够的标准。

答案 4 :(得分:-2)

我会这样做希望这有助于

SELECT member.name,        马克斯(role_performed.date)
FROM成员 LE_ JOIN role_performed on role_perfomed.member_id = member.id GROUP BY ROLE,member.name ORDER BY ROLE,member.name