关于子查询的奇怪访问行为

时间:2012-04-26 12:27:23

标签: sql ms-access

我在Access中有这个代码:

SELECT DISTINCT p.course, p.date
FROM Student s, Participation p
WHERE s.id = d.student AND footballer = NO

当我运行它时,我得到10行。所以下次我将它用作子查询:

SELECT c.course, c.date
FROM Course c
WHERE NOT EXISTS
(SELECT DISTINCT p.course, p.date
FROM Student s, Participation p
WHERE s.id = d.student AND footballer = NO)

我根本没有结果。因此,我删除了NOT中的NOT EXISTS,我获得了Course表中的所有15行。因此,在我看来,子查询中的coursedate从主查询中读取Course而不是从子查询中读取Participation。但是这怎么可能,因为我创建了不同的别名,甚至源表也不同(尽管它们都包含名称为coursedate的列),我该如何解决这个问题?

1 个答案:

答案 0 :(得分:3)

您的子查询与主查询无关。试试这样的事情?

SELECT c.course, c.date
  FROM Course c
 WHERE NOT EXISTS (
                   SELECT DISTINCT p.course, p.date
                     FROM Student s INNER JOIN Participation p ON s.id = d.student
                    WHERE footballer = NO
                      AND p.course = c.course
                      AND p.date   = c.date
                  )

现在,这会记录Course中的每条记录,并对每一行运行NOT EXISTS检查,并按Participationcourse字段过滤date表。

您的示例只运行了一次子查询。它返回了10条记录,因此NOT EXISTS总是失败。