Sql 访问时的完全外部连接
我需要在Access中执行完整的外部联接,因此我在堆栈溢出上找到了一个线程,该线程提供了以下模型: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 因此,一开始它
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,则无法得到正确的结果。但是,如果没有样本数据,没有你目前得到的数据,没有你的期望,我真的无法回答你。。示例数据和预期结果比文本描述更有用。