MS Access 完全外部联接中的莫名行为?

Posted

技术标签:

【中文标题】MS Access 完全外部联接中的莫名行为?【英文标题】:Inexplicable behaviour in MS Access full outer join? 【发布时间】:2011-11-02 17:47:36 【问题描述】:

我尝试在 MS Access 中对两个表 CMVSCTOXOSC 进行完全外连接,以检查两个/仅一个表中包含哪些 ID:

(SELECT * FROM CMVSC LEFT JOIN TOXOSC ON CMVSC.ID = TOXOSC.ID)
UNION 
(SELECT * FROM TOXOSC LEFT JOIN CMVSC ON TOXOSC.ID = CMVSC.ID);

查询可以执行,但没有达到我的预期。

CMVSC 中的前几条记录(按 ID 升序排序)是:

ID      CMV_NEGDATE CMV_POSDATE
10245   04.02.2010  28.06.1999
10642   08.10.1998  05.09.1991

TOXOSC 中的前几条记录(按 ID 升序排序)是:

ID      TOXO_NEGDATE TOXO_POSDATE
10120   22.11.1993   05.04.1991
10261   09.02.1998   23.02.1996

以下是上述查询的前两条记录:

CMVSC.ID CMV_NEGDATE CMV_POSDATE TOXOSC.ID TOXO_NEGDATE TOXO_POSDATE
10120    22.11.1993  05.04.1991         
10245    04.02.2010  28.06.1999         

注意来自TOXOSC 的记录是如何分配给CMV* 变量的,就像来自CMVSC 的记录一样。

这怎么可能?

【问题讨论】:

【参考方案1】:

原因是第一个子查询首先具有CMVSC 表,然后是TOXOSC 表。第二个子查询以相反的顺序排列它们。 UNION 获取列,并将第一个子查询中的标题用作列标题(因此混合)。试试这个:

( SELECT CMVSC.*, TOXOSC.* FROM CMVSC LEFT JOIN TOXOSC ON CMVSC.ID = TOXOSC.ID)
UNION 
( SELECT CMVSC.*, TOXOSC.* FROM TOXOSC LEFT JOIN CMVSC ON TOXOSC.ID = CMVSC.ID);

另一种方法是同时使用LEFTRIGHT 加入:

(SELECT * FROM CMVSC LEFT JOIN TOXOSC ON CMVSC.ID = TOXOSC.ID)
UNION 
(SELECT * FROM CMVSC RIGHT JOIN TOXOSC ON TOXOSC.ID = CMVSC.ID);

【讨论】:

我没想到UNION 会忽略列标识符。这是标准的 SQL92 行为还是访问问题? 这是标准的。 UNION 不使用列标识符,而是使用列列表的顺序(除了第一个子查询之外的任何标题都被忽略)。 @Simon Stelling:SQL-92 为您所期望的行为提供了UNION CORRESPONDING。不用说,Access 团队还没有实现它:( @onedaywhen:谢谢你的信息。我没有听说过(或听说过并忘记了......)。是否有支持它的 RDBMS?

以上是关于MS Access 完全外部联接中的莫名行为?的主要内容,如果未能解决你的问题,请参考以下文章

MS Access 2013 中的嵌套 SQL 联接

用于 SQL 内部联接的 MS Access 中的括号问题

无法加入备注、OLE 或超链接对象 - Access 2007 - 外部联接

确定是不是在 MS Access 2007 列表框中选择了行

与 MS SQL Server 完全联接

完全外部联接SQL Server