【问题标题】:Is it possible to do a 3 table join in MS-Access?是否可以在 MS-Access 中进行 3 表连接?
【发布时间】:2010-04-30 08:34:02
【问题描述】:

我尝试在 Access 中进行 3 表连接,但它不起作用。可能吗?

【问题讨论】:

标签: sql ms-access


【解决方案1】:

我曾经在尝试的时候遇到过问题

select
  x,
  y
from 
  A        inner join
  B on k=l inner join
  C on f=g

这不起作用。但它适用于括号:

select
  x,
  y
from ( 
  A          inner join
  B on k=l ) inner join
  C on f=g

【讨论】:

  • Jet/ACE SQL 的 JOIN 语法对于两个以上的表的连接总是需要括号。如果您在 Access QBE 中进行连接,您将始终得到正确的结果。
【解决方案2】:

在 MS-Access/Jet 中允许使用其他风格的 SQL 中可用的所有各种类型的多表连接。例如,这是一个直接的三表分层示例(比这里的其他答案更真实一点):

SELECT
    x.FirstName,
    x.Surname,
    r.RegionName,
    c.CountryName
FROM
    (Customer x LEFT JOIN Region r
    ON r.ID=x.RegionID)
    LEFT JOIN Country c
    ON c.ID=r.CountryID

或者您想知道如何使用 MS-Access 中的可视化设计器来实现吗?

【讨论】:

    【解决方案3】:

    是的,有可能:

    Select *
    From A, B, C
    Where A.a = B.b
    And A.c = C.c
    

    Select *
    From A, B, C
    Where A.a = B.b
    And B.c = C.c
    

    【讨论】:

    • 如何/为什么“非常非常非常糟糕”?我以这种方式构建查询已有 20 年了,从来没有遇到过问题 - 也许您可以充分详细地解释您的批评,以便我们理解您的观点,从而做出我们自己的明智决定...?
    • Jet/ACE 对隐式连接的优化与等效的显式连接相同,因此使用隐式连接通常不会受到任何影响。注意我说的是“经常”——我认为显式连接在可能的情况下是更可取的,所以只在我必须(或者不太复杂的地方)使用隐式连接。
    • 我还是很好奇。除了语法偏好(为了清楚起见,我可以看到一个支持显式连接语法的论点),根据我的经验,这是一个个人偏好问题,是否有任何 RDBMS 引擎可以比隐式连接更成功地优化显式连接,或者提供一些他们使用的其他优势?我不是“反对”显式连接,我只是想知道为什么我是一个非常非常非常糟糕的人来发布使用隐式连接的示例。如果我做错了二十年,看在 Xods 的份上,有人告诉我和我们所有人为什么!
    • 我认为 Jet/ACE 在某些情况下可以更好地优化显式连接。我认为它更有可能正确使用索引。在编写隐式连接时可能会出错。另一方面,使用 WHERE 子句很容易,而在 JOIN 语句中却很复杂。使用 Jet/ACE,当您有两个以上的表时,您会遇到在 JOIN 中正确使用括号的所有问题。如果您手动编写 SQL,则隐式连接可能会更容易。但我不喜欢手工编写 SQL。
    • 我为外连接使用新语法的原因是因为这是一种模棱两可的语法。您正在加入字段,而不是表。可能会编写模棱两可的语法,这会引起错误。
    【解决方案4】:

    Access 可以执行大多数类型的联接(除了完整的外部联接)我想知道您的 3 表联接是否在进行模棱两可的外部联接?看看这篇知识库文章以获得解释

    support.microsoft.com/kb/124937

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多