使用与参数相同的列选择和分组结果

时间:2016-04-26 11:21:16

标签: sql ms-access

我有一个返回以下结果的查询(示例):

+----+-----------+------------+
| ID | FirstName | CourseName |
+----+-----------+------------+
|  1 | Alice     | X          |
|  2 | Bob       | X          |
|  2 | Bob       | Y          |
+----+-----------+------------+

查询需要3个表(用户,用户课程和课程),并且使用JOIN返回用户的id和他的名字,以及他所在的所有课程的所有名称。

我需要创建一个返回特定课程中用户的查询,例如:

  • 选择课程X中的所有用户:将返回Alice和Bob的详细信息。
  • 选择X和Y课程中的所有用户:只返回Bob,因为alice不是Y.

查询X和Y的结果将是:

+----+-----------+
| ID | FirstName |
+----+-----------+
|  2 | Bob       |
+----+-----------+

1 个答案:

答案 0 :(得分:1)

假设用户表和课程表具有id和name列,而user-courses只有外键id,则可以执行以下操作:

对于第一个问题:

select u.* from user u
inner join user-courses uc on uc.user_id=u.id
inner join course c on c.id=uc.course_id and c.name='X';

它在内部联接上过滤用户,并过滤最后一部分的过程(c.name =' X')。您可以使用任何其他方式进行过滤。

对于第二个:

select * from user
where id in (
    select distinct a.* from (
        select user_id from user-courses uc inner join course c
        on c.id=uc.course_id
        where c.name='X'
    ) a
    inner join (
        select user_id from user-courses uc inner join course c
        on c.id=uc.course_id
        where c.name='Y' 
    ) b
    on a.user_id=b.user_id
);

MS-Access没有交叉,所以我使用内连接(在a和b之间)来实现相同的结果。 A是来自课程用户的表格' X'和' Y'。内部联接与两者相交,从而产生两个课程中的用户。然后我使用id来过滤。

我没有MS访问权限,所以我尝试使用PostgreSQL,但我使用的是SQL-ANSI,所以我希望如此。

相关问题