当LEFT JOIN两个表时,有没有办法将无法匹配的单元格(NULL)设置为自定义值?所以例如当结果返回时,NULL单元实际上具有一个值,例如, “N / A”或“未找到”?
我想在MS Access 2003中执行此操作
示例:
| id | value | | id | other value |
|----|-------| LEFT JOIN |----|-------------|
| 1 | hello | -- id --> | 2 | world |
| 2 | you |
results in:
| id | value | other value |
| 1 | hello | NULL |
| 2 | you | world |
but should be:
| id | value | other value |
| 1 | hello | custom-val |
| 2 | you | world |
答案 0 :(得分:2)
答案 1 :(得分:1)
请记住,SQL的外连接是一种显式设计用于投影空值的关系联合。你想避免使用null值(在我看来也是一件好事),因此你应该避免使用外连接。请注意,现代关系语言完全没有使用null和outer join的概念(参见尾注)。
此外部联接:
SELECT DISTINCT T1.id, T1.value, T2.other_value
FROM T1
LEFT OUTER JOIN T2
ON T1.id = T2.id;
...在语义上等同于此SQL代码:
SELECT T1.id, T1.value, T2.other_value
FROM T1
INNER JOIN T2
ON T1.id = T2.id
UNION
SELECT T1.id, T1.value, NULL
FROM T1
WHERE NOT EXISTS (
SELECT *
FROM T2
WHERE T1.id = T2.id
);
第二个查询可能看起来很长,但这只是因为SQL的设计/演变方式。以上只是一个自然的联合,一个联盟和一个半联盟。但是,SQL没有semijoin运算符,如果您的产品未实现标准SQL的SELECT
语法,则需要您在JOIN
子句中指定列列表并编写NATURAL JOIN
子句(Access hasn' t),这导致很多代码表达一些非常简单的东西。
因此,您可以编写代码,例如上面的第二个查询,但使用实际的默认值而不是空值。
镇上唯一的关系游戏是由Chris Date和Hugh Darwen称为“第三宣言”的D语言规范。它明确地拒绝了Codd的null(后来Codd提出了两种null)不适应外连接运算符(在最近的着作中,作者提出了关系值属性作为外连接的替代)。具体引用:
℃。 J. Date(2009):SQL和关系理论:如何编写准确的SQL代码:第4章,“关于外连接的评论”(第84页)
Darwen,Hugh(2003):列名的重要性:“请注意,在教程D中,唯一的'join'运算符称为JOIN,它意味着'自然连接'。” (第16页)
℃。 J. Date和Hugh Darwen(2006):数据库,类型和关系模型:第三个宣言:删除4:“D不包括'关系'的概念,其中某些'元组'包含一些不具有'属性'的'属性'有价值。“