在Access中,是否可以使用子查询代替FROM子句中的表?

3
在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]

包括 Part 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括号疯狂的帮助!!!)
2个回答

3

这个查询触发了"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;

关于第一个例子 - 恭喜!你发现了它,所以你可以给它命名。INVISIBLE JOINMYSTERY JOIN?让我们知道你决定了什么。 :) - Gord Thompson
1
@GordThompson 加入惊喜。 @user242379 你的LEFT JOIN问题是由查询中特定的未显示部分引起的。我将在答案中添加一个经过测试的工作示例(UNION) AS sub LEFT JOIN table - HansUp
非常感谢HansUp和Gord的帮助!由于实际代码包含公司名称作为字段名,因此很难分享。但是,在子查询中消除多余的括号已经解决了我的基本问题。现在我看到还有两个问题:多个左连接和联接中的多个条件(我希望它们都像MSSQL一样工作!),但如果我自己无法解决这些问题,我将开始一个新的问题。再次感谢!!!!!! - user242379
我想我找到答案了!!!http://nm1m.blogspot.ca/2007/10/multiple-left-joins-in-ms-access.html - user242379

1
是的,你确实可以在这种方式中使用子查询。你的问题更可能是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 [ … ]]但我不知道如何将其应用于我的子查询... - user242379
我已经更新了我的代码,尝试使用不同的括号。发现了这个链接https://dev59.com/1lPTa4cB1Zd3GeqPhDXz,我尝试了一下但还是不行(也许链接的语法只适用于union all?) - user242379
感谢您的评论,让我相信有括号问题,我也找到了解决我的问题的方法:http://nm1m.blogspot.ca/2007/10/multiple-left-joins-in-ms-access.html。如果没有您的帮助,我将不知道从哪里开始。谢谢! - user242379

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接