是否可以使用访问在 from 子句中使用子查询而不是表?

Posted

技术标签:

【中文标题】是否可以使用访问在 from 子句中使用子查询而不是表?【英文标题】:is it possible to use a subquery instead of a table in from clause using access? 【发布时间】:2013-11-20 20:58:48 【问题描述】:

在 MS ACCESS 中,是否可以:

使用子查询而不是 from 子句中的第一个表?

(下面的代码根据帮助我的好人的建议编辑)

例子:

Part 1 (now working):
    FROM
    (SELECT [Distributor2].PRODUCTCODE
      FROM [Distributor2]

      UNION

     SELECT [DISTRIBUTOR3].PRODUCTCODE
      FROM [DISTRIBUTOR3]

      UNION

     SELECT [DISTRIBUTOR1].PRODUCTCODE
      FROM [DISTRIBUTOR1]
    ) AS [ALLPRODUCTCODES]

包括第 2 部分(现在工作!甚至我的多个加入条件!!!)。我已将下面的 ALLPRODUCTSCODES 表重命名为“表 1”,以便更清楚:

  FROM ((((subqueryabove) AS [TABLE1])
LEFT JOIN [TABLE2] on (Table2.productcode = Table1.productcode AND Table2.year=2013))
LEFT JOIN [TABLE3] on (Table3.productcode = Table1.productcode AND Table3.year=2013))
LEFT JOIN [TABLE4] on (Table4.productcode = Table1.productcode AND Table4.year=2013)

(根据前两个回复的建议编辑代码 - 感谢您对 MSAccess 括号疯狂的帮助!!!)

【问题讨论】:

【参考方案1】:

这个查询触发“JOIN 操作中的语法错误”,这可能令人费解,因为没有明确的JOIN 参与。

SELECT sub.*
FROM
    (
        (SELECT 'a' AS fld1 FROM Dual)
        UNION ALL
        (SELECT 'b' AS fld1 FROM Dual)
        UNION ALL
        (SELECT 'c' AS fld1 FROM Dual)
    ) AS sub;

如下所示,删除包含每个联合 SELECT 语句的括号,允许查询运行而不会出错。我怀疑您可能正在处理同样的问题 --- 所以丢弃那些麻烦的括号。

SELECT sub.*
FROM
    (
        SELECT 'a' AS fld1 FROM Dual
        UNION ALL
        SELECT 'b' AS fld1 FROM Dual
        UNION ALL
        SELECT 'c' AS fld1 FROM Dual
    ) AS sub;

当您LEFT JOIN 子表时,它仍然可以工作。我在 Access 2007 中创建并测试了这个查询...

SELECT sub.*, tblFoo.id, tblFoo.some_text
FROM
    (
        SELECT 'a' AS fld1, 1 AS fld2 FROM Dual
        UNION ALL
        SELECT 'b' AS fld1, 2 AS fld2 FROM Dual
        UNION ALL
        SELECT 'c' AS fld1, 3 AS fld2 FROM Dual
    ) AS sub
    LEFT JOIN tblFoo
    ON sub.fld2 = tblFoo.id;

【讨论】:

re:第一个例子 - 恭喜!你发现了它,所以你可以命名它。 INVISIBLE JOIN? MYSTERY JOIN?让我们知道您的决定。 :) @GordThompson JOIN SURPRISE。 @user242379 您的LEFT JOIN 问题是由于您没有向我们显示的查询中的特定内容。我将在答案中添加一个经过测试的工作 (UNION) AS sub LEFT JOIN table 示例。 非常感谢 HansUp 和 Gord 的帮助!很难共享实际代码,因为它包含包含公司名称的字段名,但是在子查询中消除额外的括号已经解决了我的基本问题。现在我发现我还有两个问题:多个左连接和一个连接中的多个条件(我希望这一切都像 MSSQL 一样工作!)但如果我自己无法解决这些问题,我将提出一个新问题。再次感谢!!!!!!!!!!!! 我想我找到了答案!!!! nm1m.blogspot.ca/2007/10/multiple-left-joins-in-ms-access.html【参考方案2】:

是的,您当然可以以这种方式使用子查询。您的问题更有可能是 Access 在涉及多个联接时对括号有点挑剔。 Access遇到时容易报错

foo LEFT JOIN bar ON ... LEFT JOIN baz ON ...

它想看

(foo LEFT JOIN bar ON ...) LEFT JOIN baz ON ...

编辑:

我看到这个问题已经变成了一个谜题。对于它的价值,我刚刚在 Access 2010 中对此进行了测试,它对我有用(实际表和字段名称):

SELECT u.PRODUCTCODE, [TABLE].productdescription
FROM
    (
            SELECT PRODUCTCODE FROM Distributor1
        UNION
            SELECT PRODUCTCODE FROM Distributor2
        UNION
            SELECT PRODUCTCODE FROM Distributor3
    ) AS u
    LEFT JOIN
    [TABLE]
        ON u.PRODUCTCODE = [TABLE].productcode

【讨论】:

我将查询缩减为从子查询中选择,但问题仍然存在,因此我认为问题出现在子查询的括号中。我在微软的网站上找到了这个: [TABLE] query1 UNION [ALL] [TABLE] query2 [UNION [ALL] [TABLE] queryn [ ... ]] 但我只是不知道如何将它应用于我的子查询...... 我已经更新了上面的代码,用括号尝试了不同的东西。找到了这个***.com/questions/4629659/…,我试过但还是不行(也许链接的语法只适用于联合所有?) 感谢您的 cmets 让我相信存在支架问题,我还发现这个解决了我的其余问题:nm1m.blogspot.ca/2007/10/multiple-left-joins-in-ms-access.html 如果没有您,我将不知道从哪里开始.谢谢!

以上是关于是否可以使用访问在 from 子句中使用子查询而不是表?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 from 子句中使用子查询创建视图 - Mariadb

在 MS Query 中使用多个 INNER JOIN 的 FROM 子句中的子查询的语法

FROM 子句中的 Postgres 子查询

无法在 FROM 子句中使用子查询编写 JPQL 查询 - Spring Data Jpa - Hibernate

无法在 FROM 子句中使用子查询编写 JPQL 查询 - Spring Data Jpa - Hibernate

where条件放在子SQL语句中是否查询速度更快?