通过比较可空列连接三个表

Posted

技术标签:

【中文标题】通过比较可空列连接三个表【英文标题】:Joining three tables with comparing nullable columns 【发布时间】:2020-06-14 10:47:30 【问题描述】:

我有 3 张桌子: 表 1:COL1(主要)、COL2 表 2:COL1(主要,可空),COL2 表3:COL1(Primary)、COL2(外键引用表1)、COL3(外键引用表2)、COL4

现在我想加入所有 3 个表并检索表的所有值。 我有以下连接查询来获取数据

select Table1.COL1,
Table1.COL2,
Table2.COL1,
Table2.COL2,
Table3.COL1,
Table3.COL4
from Table1
INNER JOIN Table3 ON Table1.COL1=Table3.COL2
INNER JOIN Table2 ON Table3.COL3=Table2.COL1;

由于 Table2.COL1 可以为空,因此没有检索到任何值,它为 NULL。 如何操作我的查询,以便即使 Table2.COL1 为 NULL 且该列中的所有值都为 NULL,我也可以检索所有列?

【问题讨论】:

COL1 (Primary, Nullable) mysql 不允许使用可为空的列作为主键(生成错误消息All parts of a PRIMARY KEY must be NOT NULL; if you need NULL in a key, use UNIQUE instead)。 MySQL 是否允许 COL1 唯一(因为它是表 3 中的外键) UNIQUE 索引对字段可空性没有限制。但是当索引键的任何部分为 NULL 时,则根本不会检查整个记录的唯一性。 即使 Table2.COL1 为 NULL 且该列中的所有值都为 NULL,我如何操作查询以便检索所有列? FROM table2 LEFT JOIN table3 [LEFT | INNER] JOIN table1. 所以对于 Table3: COL3 (Foreign key reference Table 2)Table 2 : COL1 (Primary, Nullable) 是 NULL空? 【参考方案1】:

LEFT JOIN 用于在加入表时处理空值。您可以尝试以下查询 -

select Table1.COL1,
       Table1.COL2,
       Table2.COL1,
       Table2.COL2,
       Table3.COL1,
       Table3.COL4
from Table2
LEFT JOIN Table3 ON Table3.COL3=Table2.COL1
LEFT JOIN Table1 ON Table1.COL1=Table3.COL2;

【讨论】:

我得到了同样的结果。没有记录被填充。

以上是关于通过比较可空列连接三个表的主要内容,如果未能解决你的问题,请参考以下文章

添加新的可空列后,是不是需要更新某个表上的每个 C# SQL 查询?

检查可空列是不是稀疏或不在 SQL Server 中查询

可空列的行为并非如此

csharp Linq加入多个可空列

prisma:为啥我不能将“null”设置为可空列的默认值?

过度使用数据库中的可空列是“代码异味”吗?