sql - 如果值为 NULL,则左连接,否则为内连接
问题描述
我想在两个表上进行连接,如果值为 NULL,则复制左连接行为,如果值为 NOT NULL,则复制内连接行为。例如,对于表:
t1(val) AS (VALUES (NULL)),
t2(val) AS (VALUES ('a'), ('b'))
联接将返回带有值的单行(NULL,NULL)
(根据左联接)。对于表格:
t1(val) AS (VALUES ('c')),
t2(val) AS (VALUES ('a'), ('b'))
不会返回任何行(根据内部连接)。对于表格:
t1(val) AS (VALUES ('a')),
t2(val) AS (VALUES ('a'), ('b'))
将返回带有值的单行('a','a')
(根据任一类型的连接)。
最有效的方法是什么?
编辑:作为最大化效率的一部分,我正在寻找一个不进行后过滤的查询(即使用WHERE
子句)。
解决方案
你可以使用这个:
SELECT t1.val, t2.val
FROM t1
LEFT JOIN t2
ON t1.val = t2.val
WHERE t1.val IS NULL OR t1.val = t2.val;
或者:
SELECT NULL AS val1, NULL AS val2
FROM t1
WHERE val IS NULL
UNION ALL
SELECT t2.val, t2.val
FROM t2
INNER JOIN t1 ON t1.val = t2.val;
推荐阅读
- python-3.x - 如何在 python 中对纬度和经度数据进行聚类(或删除不需要的数据)?
- javascript - 从服务返回订阅 - 但如何在服务中使用异步结果?
- php - Wordpress/Woocommerce 产品页面 Slug 不正确
- java - 使用连接的字符分割图像
- ruby-on-rails - 如何锁定表以防止在 Rails 中创建记录?
- php - Laravel 验证来自有效负载的 json 数据
- reactjs - 无法使用状态作为查询参数执行获取请求
- android - 是否有可能在片段中调用首选项标题?
- jboss - 我们可以从任何其他客户端(jboss 客户端)调用托管在 weblogic 服务器上的 EJB(企业 Java bean)吗?
- apache - 使用 .htaccess 将子目录屏蔽为带有段的根目录