【问题标题】:Nested JOINs doesn't work嵌套的 JOIN 不起作用
【发布时间】:2012-11-02 19:07:58
【问题描述】:

我正在尝试将 SQL 查询设置为 ComboBox 的行源。

在这里。

SELECT Абонементы.НомерАбонемента
  FROM Абонементы
 INNER JOIN (Группы ON Группы.Код = Абонементы.Группа
             RIGHT JOIN Направления ON Направления.Код = Группы.Направление)
 WHERE Абонементы.НомерКарты = [НомерКарты].[Value],
       Направления.Код = [NaprCombo].[Value],
       Абонементы.ДатаОкончания > Date

但 Access 会显示一条消息,指出我在 JOIN 语句中有错误。

我想要什么:从表Абонементы 中选择Абонементы.НомерАбонемента,在组合框中选择Абонементы.ГруппаГруппа.Направление 等于Направление.Код

我想我应该首先从组合中选择Группы 匹配条件,然后将它们加入源表。也许我的括号有问题。也许我不明白嵌套的JOINs 在 MS Access 中是如何工作的。

数据结构如图所示。

更新

Access 给出的确切消息:“JOIN 操作中的语法错误”。

【问题讨论】:

  • 请给我们exact错误信息。
  • 你可以用英文给出表模式吗?至少像 tblA、tblB 和一些 makeense_field 名称这样的名称?然后,您可以稍后将任何暗示性答案转换为您需要的语言。

标签: sql ms-access join ms-access-2007


【解决方案1】:

试试这个

SELECT Абонементы.НомерАбонемента    
FROM Абонементы    
INNER JOIN 
(Группы RIGHT JOIN Направления ON Направления.Код = Группы.Направление)
ON Группы.Код = Абонементы.Группа  

【讨论】:

    【解决方案2】:

    没有确切的错误信息,我们有点盲目。但是我可以从一个问题开始,这要感谢您关于括号的 cmets...

    希望布局更改可以清楚地说明我在此示例中移动括号的原因。 (这可能不是唯一的问题,但我希望这对你来说是一个开始)

    SELECT
      Абонементы.НомерАбонемента
    FROM
      Абонементы
    INNER JOIN
      (
        Группы
      RIGHT JOIN
        Направления
          ON Направления.Код = Группы.Направление
      )
        ON Группы.Код = Абонементы.Группа
    WHERE
      Абонементы.НомерКарты = [НомерКарты].[Value]  AND
      Направления.Код = [NaprCombo].[Value]         AND
      Абонементы.ДатаОкончания > Date
    

    注意我还将WHERE x, y, z 更改为WHERE x AND y AND z

    它实际上也应该在没有括号的情况下工作。 (虽然我不使用 Access,并且知道它有一些“有趣”的规则。)希望这是一个很好的例子,说明如果/何时需要它们。

    【讨论】:

    • “不支持 JOIN 表达式”,这就是它对我说的。好的,谢谢,我稍后再看看……
    【解决方案3】:

    我不确定这是否会返回您想要的数据,但重要的是您有一个针对其中一个 JOIN 的子查询:

    SELECT  t1.НомерАбонемента 
    FROM Направления 
    LEFT JOIN
        (SELECT  Группы.Направление, 
                 Абонементы.НомерАбонемента, 
                 Абонементы.ДатаОкончания
        FROM Абонементы
        INNER JOIN Группы ON Группы.Код = Абонементы.Группа ) As t1
    ON Направления.Код = t1.Направление
    
    WHERE t1.НомерКарты = [НомерКарты] 
    AND Направления.Код = [NaprCombo] 
    AND t1.ДатаОкончания > Date
    

    我建议您在添加 WHERE 语句之前让查询正常工作。 WHERE 语句用 AND / OR 连接,而不是逗号。控件的 value 属性是默认值,因此当您希望返回值时,您不必使用属性。

    【讨论】:

      【解决方案4】:

      您似乎不需要正确的加入。一直使用内连接,只要给它一个正确的括号:

      SELECT Абонементы.НомерАбонемента
        FROM (Абонементы
       INNER JOIN Группы ON Группы.Код = Абонементы.Группа)
       INNER JOIN Направления ON Направления.Код = Группы.Направление
       WHERE Абонементы.НомерКарты = [НомерКарты].[Value],
             Направления.Код = [NaprCombo].[Value],
             Абонементы.ДатаОкончания > Date
      

      基本上,如果连接的左侧也不是表引用而是连接,它必须用括号括起来。例如,如果只有两个表,则不需要括号:

      ... FROM A JOIN B ON ...
      

      但是如果你引入另一个join,你会这样:

      ... FROM (A JOIN B ON ...) JOIN C ON ...
      

      如果还有另一个,您需要像这样将前两个连接括起​​来:

      ... FROM ((A JOIN B ON ...) JOIN C ON ...) JOIN D ON ...
      

      等等。

      另一种语法

      ... FROM A JOIN (B JOIN C ON ...) ON ...
      

      根据您收到的错误消息said (JOIN expression not supported) 看来,MS Access 似乎不支持(您的版本)。

      【讨论】:

        最近更新 更多