MS Access 完全外部联接中的莫名行为?
Posted
技术标签:
【中文标题】MS Access 完全外部联接中的莫名行为?【英文标题】:Inexplicable behaviour in MS Access full outer join? 【发布时间】:2011-11-02 17:47:36 【问题描述】:我尝试在 MS Access 中对两个表 CMVSC
和 TOXOSC
进行完全外连接,以检查两个/仅一个表中包含哪些 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);
另一种方法是同时使用LEFT
和RIGHT
加入:
(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 完全外部联接中的莫名行为?的主要内容,如果未能解决你的问题,请参考以下文章
无法加入备注、OLE 或超链接对象 - Access 2007 - 外部联接