是否可以使用访问在 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 子句中使用子查询编写 JPQL 查询 - Spring Data Jpa - Hibernate