嵌套的内部连接&在Access中进行子选择

时间:2012-12-05 22:39:31

标签: sql ms-access-2010

我在Access中有这个SQL,但它给了我一个错误。我试过移动括号但它没有解决问题。

SELECT
    a.title, a.id, a.name, l.user, l.time 
FROM
    Reports a
INNER JOIN (
    AuditLog AS l ON a.id = l.id
INNER JOIN (
(
    SELECT min(time) Mintime, id
    from AuditLog
    GROUP BY id
) AS t )
  ON l.id = t.id
  AND l.time = t.mintime )
WHERE
    a.NAME LIKE 'something*'
    AND a.ACTIVE='Y'

如何解决我遇到的语法错误?

2 个答案:

答案 0 :(得分:2)

除非您有or条件,否则不应该使用括号。在Access中尝试此操作,看看它是否有效:

SELECT
    a.title, a.id, a.name, l.user, l.time 
FROM
    (Reports a INNER JOIN AuditLog AS l ON a.id = l.id) INNER JOIN
    (
        SELECT min(time) as Mintime, id
        from AuditLog
        GROUP BY id
    ) AS t ON l.id = t.id AND l.time = t.mintime
WHERE
    a.NAME LIKE 'something*'
    AND a.ACTIVE='Y'

我在Access中没有完成子查询,所以看看它是否在子查询的左括号旁边报告错误会很有趣。

答案 1 :(得分:2)

这段查询肯定会产生问题:

SELECT min(time) Mintime, id

如果您打算将字段表达式min(time)替换为Mintime,则必须使用AS关键字。对于表别名,您不需要AS,但是您需要使用字段别名:

SELECT min(time) AS Mintime, id

似乎timeAuditLog表格中的字段。在这种情况下,将其名称括在方括号中,以区别于Time()函数:

SELECT min([time]) AS Mintime, id

对于括号,如果可能,您应该使用Access'查询设计器来设置连接。它将保证您的查询包含db引擎所需的括号,并将正确定位它们。

如果这不是一个选项,请试试这个未经测试的版本:

SELECT
    a.title, a.id, a.name, l.user, l.time 
FROM
    (Reports a
    INNER JOIN AuditLog AS l
    ON a.id = l.id)
    INNER JOIN
        (
            SELECT min([time]) AS Mintime, id
            from AuditLog
            GROUP BY id
        ) AS t
    ON
            l.id = t.id
        AND l.time = t.mintime
WHERE
        a.NAME LIKE 'something*'
    AND a.ACTIVE='Y'