在 MS ACCESS 中实现 INTERSECT (INNER JOIN)

Posted

技术标签:

【中文标题】在 MS ACCESS 中实现 INTERSECT (INNER JOIN)【英文标题】:Implementing INTERSECT (INNER JOIN) in MS ACCESS 【发布时间】:2012-05-08 15:41:04 【问题描述】:

我一直在研究如何将我拥有的 UNION 转换为 INTERSECT,但 MS Access 中没有 INTERSECT 关键字。

如果我想要这两个 select 语句的交集而不是它们的并集,那么下面的代码使用内连接会是什么样子,我一直很困惑。

我知道如果我 SELECT DISTINCT 然后使用内部联接,我可以实现我想要的,但 ON 关键字真的让我感到困惑。

我一周前刚开始使用 SQL,所以如果您发现代码有任何其他问题,我会接受所有建设性的批评 :)

SELECT *
FROM (SELECT [Catt].[Name]
FROM [Catt]
WHERE ((([Catt].[Name]) Like "*" & [forms]![Main]![SrchText] & "*") 
AND [forms]![Main]!   [SrchText] IS NOT Null AND [forms]![Main]![SrchText]<>''  )

UNION

SELECT [Catt].[Name]
FROM [Catt]
WHERE  ((([Catt].[Category]) Like [forms]![Main]![Combo7].Value) AND (([forms]![Main]!    [SrchText] IS Null) OR ([forms]![Main]![SrchText]=''))))  AS Query
ORDER BY [Catt].[Name];

谢谢。

【问题讨论】:

如果视图中的列数不同,则无法合并或相交 哦,所以因为我在秒选择中使用了[名称]和[类别],所以相交不起作用?问题是到目前为止,Union 一直在为我工作,只是想改成交集。 是的,我明白了。我的意思是你不能联合 Select * 和 Select catt.name。我给个解决办法 How can I implement SQL INTERSECT and MINUS operations in MS Access的可能重复 【参考方案1】:

尚未对此进行测试,因此您肯定会进行大量 MS Access 特定更改。但我要求您不要通过不必要地在方块中引用每个标识符来混淆查询:

SELECT     DISTINCT title
FROM       (  
            SELECT [Catt].[Name] as title
            FROM   [Catt]
            WHERE  ([Catt].[Name] Like "*" & [forms]![Main]![SrchText] & "*") AND 
                    [forms]![Main]![SrchText] IS NOT Null AND 
                    [forms]![Main]![SrchText] <>''
           ) AS view1

INNER JOIN 

           (   
            SELECT   [Catt].[Name]
            FROM     [Catt]
            WHERE    [Catt].[Category] Like [forms]![Main]![Combo7].Value AND 
                     ([forms]![Main]![SrchText] IS Null OR 
                      [forms]![Main]![SrchText]='')
           ) AS view2 ON view1.title = view2.Name

ORDER BY   view1.title

但基本上这样的事情就可以解决问题..

如戈登指出的那样编辑

【讨论】:

在子查询 (view2) 中使用 ORDER BY 对我来说似乎是错误的。如果您想要ORDER BY,请在子查询之外进行。 @HansUp 我想现在可以了吗? 更好。感谢您的格式……使它更容易阅读。我将添加一些更改。如果您不同意,请回滚我的更改。 @HansUp 当然,我总是可以通过避免琐碎的选择来使查询更简洁和更快,但我觉得我会保留它,以便 OP 了解如何通过两个查询完成 INTERSECT。将 ORDER BY 放在子查询中是我故意遗漏的一种优化,以使查询对 OP 更清晰 @HansUp 我需要第一个 SELECT * 来自然后另一个内部查询吗?不能直接写:SELECT [Catt].[Name] FROM [Catt] WHERE ........ AS view1

以上是关于在 MS ACCESS 中实现 INTERSECT (INNER JOIN)的主要内容,如果未能解决你的问题,请参考以下文章

抑制 MS Access Excel 警告/错误

需要帮助在 MS Access 中实施完全外部联接

如何在 vb.net 中实现交易方式?

如何在 MS Access 中相交?

MS Access SQL 将行转换为列

如何在 Access 2003 中实现版本控制?