sql - 仅当值存在时,如何从带有 WHERE 子句的连接表中进行选择?
问题描述
我想从 table1 (WHERE t1.id = 1) 中选择一条记录,然后将 table2 和 table3 (t2.field2 和 t3.field3) 加入到 table1 但仅当值存在时(IS NOT NULL)。
例如,如果 t3.field3 的值不存在,则不会为该表显示 field3 列...
t1
id | field1
---------------
1 | f1val
2 | f1val
3 | f1val
t2
id(fk) | field2
-------------------
1 | f2val
2 | null
3 | null
t3
id(fk) | field3
-------------------
1 | null
2 | f3val
3 | f3val
我试图做的代码是这样的:
SELECT t1.id, t2.field1, t3.field3
FROM (
SELECT t1.id
FROM t1
WHERE t1.id = 1
)
LEFT JOIN t2 ON t2.id = t1.id AND t2.id is not null
LEFT JOIN t3 ON t2.id = t1.id AND t3.id is not null;
从上面的查询返回的连接表如下所示:
id | field2 | field3
----------------------------
1 | f1val | null
但是,由于 field3 为空,我希望它只返回 id 和 field2,如下所示:
id | field2
----------------
1 | f1val
您的帮助将不胜感激。
解决方案
您可以返回一列,使用coalesce()
:
SELECT t1.id, COALESCE(t2.field1, t3.field3) as field_2_3
FROM t1 LEFT JOIN
t2
ON t2.id = t1.id LEFT JOIN
t3
ON t3.id = t1.id
WHERE t1.id = 1;
但是,您有时不能返回 2 列,有时不能返回 3 列。
笔记:
- 子查询
t1
完全没有必要。您可以只在单个WHERE
子句中应用过滤器。 - 的比较
IS NOT NULL
是不必要的,因为它们JOIN
无论如何都不符合条件。 - 最后一个
JOIN
条件大概是 ont3.id = t1.id
。
推荐阅读
- typescript - TypeScript 泛型,提升函数返回类型
- wordnet - 使用维基词典数据构建的图表
- docker - Docker 和非 root 用户使用 GitLab CI Runner 时如何解决权限问题?
- java - Java Pattern 单行模式
- javascript - 在水下发送 webhook(JQuery/Ajax 或无需在浏览器中打开链接)
- asp.net - 如何创建包含 JavaScript 互操作的 Blazor 库
- python - 错误:列
是没有时区的时间戳类型,但表达式的类型是字符变化 - reactjs - 在 console.log 上反应的 API 表现不同
- c# - 在 linq 中对具有不同标准的订单线进行排序
- c# - 无法在 DLL“OraOps12.dll”中找到名为“OpsConGetMaxOpenCursorInfo”的入口点