如何解决将 JOIN 子句中的过滤器转换为 WHERE 子句
我有一个查询,其中在 JOIN 子句中添加了过滤条件。我必须将该条件移至 WHERE 子句。有可能吗?
代码:
SELECT disTINCT
ut.vehicle_id,DATE(ut.DATE) Date,ROW_NUMBER() OVER (PARTITION BY ut.vehicle_id ORDER BY DATE(UT.DATE)) RN
FROM
awsdatacatalog.waves.unlimited_wash_transaction ut
LEFT JOIN
awsdatacatalog.waves.wash_invoice WI ON WI.invoice_id = ut.invoice_id
LEFT JOIN
awsdatacatalog.waves.unlimited_customer uc ON UC.vehicle_id = UT.vehicle_id
AND start_date BETWEEN DATE('2021-05-01') AND DATE('2021-05-30')
WHERE
DATE(UT.date) BETWEEN DATE('2021-05-01') AND Date('2021-05-31')
AND (ut.Status IN ('RESIGNUP','RECURRING'))
AND UC.vehicle_id IS NULL
AND WI.Status IN ('Completed','Partiallyrefunded')
AND (ut.Is_refunded IS NULL OR CAST(ut.Is_refunded AS INTEGER) = 0)
ORDER B Y
ut.vehicle_id
我想移动条件:
start_date BETWEEN Date('2021-05-01') AND Date('2021-05-30')
到 WHERE
子句,但如果我这样做,我会得到错误的结果。
请帮帮我。
解决方法
将连接条件从外部(左/右)连接移动到 where 子句是一个坏主意。让我解释一下原因。
比如说,我们有两张桌子,员工和他们的车
员工 | emp_id |姓名 | |--------|------| | 1 |卡尔 | | 2 |唐纳德 | | 3 |宝拉|
汽车 | emp_id |汽车 | |--------|----| | 1 |欧宝 | |3 |宝马|
现在让我们假设我们不喜欢宝马,所以根据我们的口味离开加入那些桌子
select e.name,c.car
from employees e
LEFT join cars.c
on e.emp_id = c.emp_id
AND c.car <> 'BMW'
该查询将首先过滤掉cars 表以删除“BMW”行并执行外连接。 “左连接”的意思是“将第一个表中的所有行加入第二个表,并用空值填充不存在的行”。
结果就是这样
姓名 | 汽车 |
---|---|
卡尔 | 欧宝 |
唐纳德 | 空 |
宝拉 | 空 |
请注意,Donald 为 null,因为他根本没有任何汽车,而 Paula 拥有 BMW,但在加入之前被过滤掉了。
现在,当过滤器移动到 WHERE 部分时
select e.name,c.car
from employees e
LEFT join cars.c
on e.emp_id = c.emp_id
WHERE c.car <> 'BMW'
数据库现在将首先连接表(参见下面的步骤 1 表),然后应用过滤器(参见下面的步骤 2 表)。
Step1 - 在这一步只执行了左连接
姓名 | 汽车 |
---|---|
卡尔 | 欧宝 |
唐纳德 | 空 |
宝拉 | 宝马 |
Step2 - 这是应用过滤器“car 'BMW'”后的最终结果
姓名 | 汽车 |
---|---|
卡尔 | 欧宝 |
唐纳德 | 空 |
缺少什么?
我不明白为什么您需要将该条件从 join 移动到 where 子句,但如果您坚持,您不仅要过滤日期,还要保留 start_date 为空的所有行才能获得相同的结果结果。
所以,它会是那种东西
(start_date is null or start_date BETWEEN Date('2021-05-01') AND Date('2021-05-30'))
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。