【问题标题】:MS Access equivalent queryMS Access 等效查询
【发布时间】:2014-02-17 21:33:01
【问题描述】:

我正在尝试编写一个我知道与 MySQL 到 MS Access 兼容的查询。这是一项编程作业,所以我不希望直接给我答案,但我不太了解 MS Access 的 SQL 版本。我自己编写了 MySQL,并对其进行了测试。那时我意识到查询需要为 MS Access 工作。所以这里是已知的代码:

SELECT `D`.`RENT_NUM`, 
    `R`.`RENT_DATE`, 
    `D`.`VID_NUM`, 
    `M`.`MOVIE_TITLE`, 
    `D`.`DETAIL_DUEDATE`, 
    `D`.`DETAIL_RETURNDATE`, 
    `D`.`DETAIL_FEE`, 
    `D`.`DETAIL_RETURNDATE` - `D`.`DETAIL_DUEDATE` AS `DAYS_LATE`
FROM `detailrental` AS `D`
    JOIN `rental` AS `R` ON `D`.`RENT_NUM` = `R`.`RENT_NUM`
    JOIN `video` AS `V` ON `D`.`VID_NUM` = `V`.`VID_NUM`
    JOIN `movie` AS `M` ON `V`.`MOVIE_NUM` = `M`.`MOVIE_NUM`
WHERE `D`.`DETAIL_RETURNDATE` - `D`.`DETAIL_DUEDATE` > 0
    ORDER BY `R`.`RENT_NUM`, `M`.`MOVIE_TITLE`;

我一直在尝试转换为 MS Access SQL,但还是不明白。这是最近的尝试。

SELECT [D].[RENT_NUM],
    [R].[RENT_DATE],
    [D].[VID_NUM],
    [M].[MOVIE_TITLE],
    [D].[DETAIL_DUEDATE],
    [D].[DETAIL_RETURNDATE],
    [D].[DETAIL_FEE],
    [D].[DETAIL_RETURNDATE] - [D].[DETAIL_DUEDATE] AS [DAYS_LATE]
FROM [DETAILRENTAL] AS [D] INNER JOIN 
( 
  [RENTAL] AS [R] INNER JOIN 
  (
    [VIDEO] AS [V] INNER JOIN [MOVIE] AS [M] ON [V].[MOVIE_NUM] = [M].[MOVIE_NUM]
  )  ON [D].[VID_NUM] = [V].[VID_NUM]
) ON [D].[RENT_NUM] = [R].[RENT_NUM]
WHERE [D].[DETAIL_RETURNDATE] - [D].[DETAIL_DUEDATE] > 0
    ORDER BY [R].[RENT_NUM], [M].[MOVIE_TITLE];

我收到的错误是 Syntax error in JOIN operation. 我知道那是什么意思,但我不知道 MS Access 的 SQL 足以发现错误。

【问题讨论】:

    标签: mysql sql ms-access


    【解决方案1】:

    自从我不得不编写任何访问查询以来已经有一段时间了,所以我只使用官方文档http://msdn.microsoft.com/en-us/library/office/bb208854(v=office.12).aspx 中描述的语法。发现它有语法错误。因此,要使查询工作,您必须用括号括起来 JOIN。但是每个ON 语句仍然需要在每组括号内而不是在外面。这应该可以解决问题。

    SELECT [D].[RENT_NUM]
           ,[R].[RENT_DATE]
           ,[D].[VID_NUM]
           ,[M].[MOVIE_TITLE]
           ,[D].[DETAIL_DUEDATE]
           ,[D].[DETAIL_RETURNDATE]
           ,[D].[DETAIL_FEE]
           ,[D].[DETAIL_RETURNDATE] - [D].[DETAIL_DUEDATE] AS [DAYS_LATE]
        FROM (
               (
                 (
                   [detailrental] AS [D] )
                 INNER JOIN [rental] AS [R]
                    ON [D].[RENT_NUM] = [R].[RENT_NUM] )
               INNER JOIN [video] AS [V]
                ON D.VID_NUM = [V].[VID_NUM] )
        INNER JOIN [movie] AS [M]
            ON [V].[MOVIE_NUM] = [M].[MOVIE_NUM]
        WHERE [D].[DETAIL_RETURNDATE] - [D].[DETAIL_DUEDATE] > 0
        ORDER BY [R].[RENT_NUM]
           ,[M].[MOVIE_TITLE];
    

    【讨论】:

    • 我最初没有任何 () 括号,但它不起作用。尝试这个,我收到一个错误Syntax error in FROM clause,它突出显示了第一个 JOIN。使用括号解决了(?)该问题,但引入了另一个问题。我尝试使用基于this SO 问题的括号
    • 这个答案是正确的,但是[detailrental] AS [D] 周围的括号集可以去掉。
    • 是的,那个编辑是正确的,Tmdean 的评论也是正确的。有时我想知道 MS Access 必须存在。我认为这很糟糕。
    【解决方案2】:

    既然我们知道问题出在 JOIN 上,让我们从最里面的一组括号开始,然后向外工作:

    [VIDEO] AS [V] 
    INNER JOIN 
    [MOVIE] AS [M] 
        ON [V].[MOVIE_NUM] = [M].[MOVIE_NUM]
    

    看起来不错。让我们移出一层:

    [RENTAL] AS [R] INNER JOIN 
    (
        [VIDEO] AS [V] 
        INNER JOIN 
        [MOVIE] AS [M] 
            ON [V].[MOVIE_NUM] = [M].[MOVIE_NUM]
    )
        ON [D].[VID_NUM] = [V].[VID_NUM]
    

    此 JOIN 不起作用。你知道为什么吗?

    【讨论】:

    • 其实我没有。我一直在看它,但我仍然不明白。查看 SaUce 的最新编辑让我更好地理解了 MS Access 如何需要括号
    • @sonoftunk 查看最后一个 ON 子句中的表别名。
    • 是表别名D还没初始化?按照这种逻辑, SELECT [D].[RENT_NUM] 也不起作用,尽管它确实起作用。除非您说括号中的任何事情都在其他事情之前完成?
    • @sonoftunk 是的,问题是此时在 FROM 子句的评估中,别名 [D] 还不存在,因为它位于括号的外部集合中。虽然我理解您的推理:在列列表中使用 [D] 别名,您需要记住 SQL 语句不一定会一次全部解析。查询优化器首先需要确定涉及哪些表以及它们是如何相关的,一旦完成,它就可以继续处理其他细节,例如哪些列应该包含在结果集中。
    猜你喜欢
    • 1970-01-01
    • 2015-06-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多