微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

将 JOIN 子句中的过滤器转换为 WHERE 子句

如何解决将 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 举报,一经查实,本站将立刻删除。