带有架构的表 T1
身份证 | 类型 | 型号_ID | 频率 |
---|---|---|---|
1 | 汽车 | 234 | 5 |
2 | SUV | 12 | 6 |
3 | 电动车 | 空 | 空 |
4 | 高压 | 空 | 空 |
带有模式和数据的表 T2
身份证 | 类型 | 型号_ID | 频率 |
---|---|---|---|
3 | 电动车 | 空 | 空 |
4 | 高压 | 空 | 空 |
现在我正在检查以下查询的工作情况,
SELECT * FROM T1 AS T, T2 AS N
WHERE T.ID = N.ID AND T.TYPE = N.TYPE AND T.MODEL_ID = N.MODEL_ID AND T.FREQ = N.FREQ
结果是空集,我知道我需要实现一个空安全查询,但是对于这种情况我该如何实现它。
注意:这里的ID不是标识符,所以应该与表中的每一列进行比较。
您可以使用 IS NOT DISTINCT FROM 来执行 NULL 安全比较:
比较两个表达式是否相等(或不相等)。该函数是 NULL 安全的,这意味着它将 NULL 视为用于比较相等性的已知值。
SELECT *
FROM T1 AS T, T2 AS N
WHERE T.ID IS NOT DISTINCT FROM N.ID
AND T.TYPE IS NOT DISTINCT FROM N.TYPE
AND T.MODEL_ID IS NOT DISTINCT FROM N.MODEL_ID
AND T.FREQ IS NOT DISTINCT FROM N.FREQ;
另一个更简单的选项是使用 INTERSECT 集合运算符:
SELECT * FROM t1
INTERSECT
SELECT * FROM T2;
还有一个选择:
SELECT *
FROM T1 AS T, T2 AS N
WHERE EQUAL_NULL(T.ID,N.ID)
AND EQUAL_NULL(T.TYPE,N.TYPE)
AND EQUAL_NULL(T.MODEL_ID,N.MODEL_ID)
AND EQUAL_NULL(T.FREQ,N.FREQ);