Sql 访问时的完全外部连接

Sql 访问时的完全外部连接,sql,ms-access,outer-join,Sql,Ms Access,Outer Join,我需要在Access中执行完整的外部联接,因此我在堆栈溢出上找到了一个线程,该线程提供了以下模型: SELECT * FROM AA LEFT JOIN BB ON AA.C_ID = BB.C_ID AND AA.Currency = BB.Currency UNION SELECT * FROM AA RIGHT JOIN BB ON AA.C_ID = BB.C_ID AND AA.Curency = BB.Currency 因此,一开始它

我需要在Access中执行完整的外部联接,因此我在堆栈溢出上找到了一个线程,该线程提供了以下模型:

SELECT *
    FROM AA
        LEFT JOIN BB ON AA.C_ID = BB.C_ID AND AA.Currency = BB.Currency
UNION
SELECT *
    FROM AA
        RIGHT JOIN BB ON AA.C_ID = BB.C_ID AND AA.Curency = BB.Currency
因此,一开始它似乎是有效的(大约95%的结果匹配),但当我检查一列的总和时,它有轻微的变化(在我的例子中,我有800K行,因此变化是非常重要的)

此外,每个表中的一些ID为NULL,ID为NULL的每一行都需要在完全外部联接之后位于不同的行上。 我想有些排,你知道怎么了吗


提前感谢

我建议创建一个所有ID/货币组合的列表,然后使用
左连接
s:

SELECT AA.*, BB.*
FROM ((SELECT AA.C_ID, AA.Currency FROM AA
       UNION  -- on purpose to remove duplicates
       SELECT BB.C_ID, BB.Currency FROM BB
      ) as IDS LEFT JOIN
      AA
      ON AA.C_ID = IDS.C_ID AND
         AA.Currency = IDS.Currency
     ) LEFT JOIN
     BB
     ON AA.C_ID = BB.C_ID AND
        AA.Currency = BB.Currency;
NULL
值为完全联接带来了问题。与SQL中的
FULL JOIN
定义一样,
NULL
值不匹配。您还可以扩展逻辑,以比较
NULL
值:

SELECT AA.*, BB.*
FROM ((SELECT AA.C_ID, AA.Currency FROM AA
       UNION  -- on purpose to remove duplicates
       SELECT BB.C_ID, BB.Currency FROM BB
      ) as IDS LEFT JOIN
      AA
      ON (AA.C_ID = IDS.C_ID OR AA.C_ID IS NULL AND IDS.C_ID IS NULL) AND
         (AA.Currency = IDS.Currency OR AA.CURRENCY IS NULL AND IDS.CURRENCY IS NULL)
     ) LEFT JOIN
     BB
      ON (BB.C_ID = IDS.C_ID OR BB.C_ID IS NULL AND IDS.C_ID IS NULL) AND
         (BB.Currency = IDS.Currency OR BB.CURRENCY IS NULL AND IDS.CURRENCY IS NULL);

可能重复的请在使用标签时阅读标签说明:sql:“问题应包括[…]样本数据,以及正在使用的DBMS实现(例如MySQL、PostgreSQL、Oracle、MS sql Server、IBM DB2等)的标签”,access:“不要将此标签用于Microsoft access,而是使用[MS access]forpas,我提到我在Stack Overflow的另一个线程上找到了代码,但它不起作用。这就是我创建自己线程的原因。请注意,在SQL中,比较
{anything}=NULL
将始终是
NULL
(false)。这可能就是为什么如果您在
NULL
处有
ID
s,则无法得到正确的结果。但是,如果没有样本数据,没有你目前得到的数据,没有你的期望,我真的无法回答你。。示例数据和预期结果比文本描述更有用。