【问题标题】:is it possible to use a subquery instead of a table in from clause using access?是否可以使用访问在 from 子句中使用子查询而不是表?
【发布时间】: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 括号疯狂的帮助!!!)

【问题讨论】:

    标签: sql ms-access subquery


    【解决方案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 一样工作!)但如果我自己无法解决这些问题,我将提出一个新问题。再次感谢!!!!!!!!!!!!
    【解决方案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 [ ... ]] 但我只是不知道如何将它应用于我的子查询......
    • 我已经更新了上面的代码,用括号尝试了不同的东西。找到了这个stackoverflow.com/questions/4629659/…,我试过但还是不行(也许链接的语法只适用于联合所有?)
    • 感谢您的 cmets 让我相信存在支架问题,我还发现这个解决了我的其余问题:nm1m.blogspot.ca/2007/10/multiple-left-joins-in-ms-access.html 如果没有您,我将不知道从哪里开始.谢谢!
    猜你喜欢
    • 1970-01-01
    • 2019-07-22
    • 1970-01-01
    • 1970-01-01
    • 2023-04-06
    • 2020-10-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多