【问题标题】:use WHERE clause before LEFT JOIN in a select statement在选择语句中的 LEFT JOIN 之前使用 WHERE 子句
【发布时间】:2018-09-05 22:02:46
【问题描述】:

我有下面的代码,并希望在左连接之前如何使用“where”子句获得一些帮助 - 我有一个包含大量数据的表,但需要在我之前按薪水选项过滤它返回我想要的 select 语句的结果。请参阅下面的代码,在此先感谢。

此外,执行需要很长时间。 6 分钟以上,对于只有 70 或 80 条记录的表。我编写查询的方式可能有问题吗?谢谢

select 

a.TicketNo,
a1.Details_PCredit as Salary_Amount_1,
a1.Details_PTransactionDate as Salary_Date_1,
a2.Details_PCredit as Salary_Amount_2,
a2.Details_PTransactionDate as Salary_Date_2,
a3.Details_PCredit as Salary_Amount_3,
a3.Details_PTransactionDate as Salary_Date_3,
a4.Details_PCredit as Salary_Amount_4,
a4.Details_PTransactionDate as Salary_Date_4,
a5.Details_PCredit as Salary_Amount_5,
a5.Details_PTransactionDate as Salary_Date_5,
a6.Details_PCredit as Salary_Amount_6,
a6.Details_PTransactionDate as Salary_Date_6

from staging.MBS_Transactions as a


left join (
select TicketNo, Details_PNarration,
       max(Details_PTransactionDate) as maxDate        
       from staging.MBS_Transactions group by TicketNo
) as a0 on a0.TicketNo=a.TicketNo 
left join staging.MBS_Transactions as a1 on a1.TicketNo=a.TicketNo and a1.Details_PTransactionDate=a0.maxDate 
left join staging.MBS_Transactions as a2 on a2.TicketNo=a1.TicketNo and a2.Details_PTransactionDate<a1.Details_PTransactionDate
left join staging.MBS_Transactions as a3 on a3.TicketNo=a2.TicketNo and a3.Details_PTransactionDate<a2.Details_PTransactionDate
left join staging.MBS_Transactions as a4 on a4.TicketNo=a3.TicketNo and a4.Details_PTransactionDate<a3.Details_PTransactionDate
left join staging.MBS_Transactions as a5 on a5.TicketNo=a4.TicketNo and a5.Details_PTransactionDate<a4.Details_PTransactionDate
left join staging.MBS_Transactions as a6 on a6.TicketNo=a5.TicketNo and a6.Details_PTransactionDate<a5.Details_PTransactionDate
    where  
        (a.Details_PNarration like '%SALARY%' 
        OR a.Details_PNarration like '%Mid MTH%'
        OR a.Details_PNarration like '%Mid Month%'
        OR a.Details_PNarration like '%Mid Month%'
        OR a.Details_PNarration like '%Staff%'
        OR a.Details_PNarration like '%SAL%'
        AND DAY(a.Details_PTransactionDate) between '23' and '25' 
        and WEEKDAY(a.Details_PTransactionDate) Between 0 and 4)

group by a.TicketNo;

【问题讨论】:

  • 能否发布查询计划+现有索引?
  • 可以接受不同的结果结构吗?因为您以不同的别名加入同一张表 6 次,我觉得这可以在一个操作中分组,限制设置为 6 个结果。结果结构会略有不同,例如一组结果而不是具有 1,2,3.. 的固定键。
  • 你使用的是哪个版本的mysql
  • 这看起来你的桌子设计得很糟糕。另请阅读手册中的索引和优化。还要阅读并处理minimal reproducible example,包括 EXPLAIN 输出。

标签: mysql sql select left-join where-clause


【解决方案1】:

您可以在 where 中使用嵌套查询

select 

a.TicketNo,
a1.Details_PCredit as Salary_Amount_1,
a1.Details_PTransactionDate as Salary_Date_1,
a2.Details_PCredit as Salary_Amount_2,
a2.Details_PTransactionDate as Salary_Date_2,
a3.Details_PCredit as Salary_Amount_3,
a3.Details_PTransactionDate as Salary_Date_3,
a4.Details_PCredit as Salary_Amount_4,
a4.Details_PTransactionDate as Salary_Date_4,
a5.Details_PCredit as Salary_Amount_5,
a5.Details_PTransactionDate as Salary_Date_5,
a6.Details_PCredit as Salary_Amount_6,
a6.Details_PTransactionDate as Salary_Date_6

from (SELECT * FROM staging.MBS_Transactions a where  
        (a.Details_PNarration like '%SALARY%' 
        OR a.Details_PNarration like '%Mid MTH%'
        OR a.Details_PNarration like '%Mid Month%'
        OR a.Details_PNarration like '%Mid Month%'
        OR a.Details_PNarration like '%Staff%'
        OR a.Details_PNarration like '%SAL%'
        AND DAY(a.Details_PTransactionDate) between '23' and '25' 
        and WEEKDAY(a.Details_PTransactionDate) Between 0 and 4)) as a


left join (
select TicketNo, Details_PNarration,
       max(Details_PTransactionDate) as maxDate        
       from staging.MBS_Transactions group by TicketNo
) as a0 on a0.TicketNo=a.TicketNo 
left join staging.MBS_Transactions as a1 on a1.TicketNo=a.TicketNo and a1.Details_PTransactionDate=a0.maxDate 
left join staging.MBS_Transactions as a2 on a2.TicketNo=a1.TicketNo and a2.Details_PTransactionDate<a1.Details_PTransactionDate
left join staging.MBS_Transactions as a3 on a3.TicketNo=a2.TicketNo and a3.Details_PTransactionDate<a2.Details_PTransactionDate
left join staging.MBS_Transactions as a4 on a4.TicketNo=a3.TicketNo and a4.Details_PTransactionDate<a3.Details_PTransactionDate
left join staging.MBS_Transactions as a5 on a5.TicketNo=a4.TicketNo and a5.Details_PTransactionDate<a4.Details_PTransactionDate
left join staging.MBS_Transactions as a6 on a6.TicketNo=a5.TicketNo and a6.Details_PTransactionDate<a5.Details_PTransactionDate


group by a.TicketNo;

【讨论】:

  • 我打赌查询计划将与原始查询相同
猜你喜欢
  • 1970-01-01
  • 2014-05-25
  • 1970-01-01
  • 1970-01-01
  • 2012-04-25
  • 2022-01-23
  • 2010-11-26
  • 1970-01-01
  • 2011-07-06
相关资源
最近更新 更多