【问题标题】:Inexplicable behaviour in MS Access full outer join?MS Access 完全外部联接中的莫名行为?
【发布时间】: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 的记录一样。

这怎么可能?

【问题讨论】:

    标签: sql ms-access join outer-join


    【解决方案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?
    猜你喜欢
    • 2017-08-04
    • 1970-01-01
    • 2014-12-18
    • 2014-08-21
    • 1970-01-01
    • 2021-11-17
    • 2011-07-26
    相关资源
    最近更新 更多