mysql - 在 select 语句中 LEFT JOIN 之前使用 WHERE 子句

标签 mysql sql select left-join where-clause

我有下面的代码,希望获得一些有关如何在左连接之前使用“where”子句的帮助 - 我有一个包含大量数据的表,但需要在使用之前通过薪资选项对其进行过滤返回我想要的 select 语句的结果。请参阅下面的代码,提前致谢。

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

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;

最佳答案

您可以使用 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;

关于mysql - 在 select 语句中 LEFT JOIN 之前使用 WHERE 子句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49513835/

相关文章:

grails - grails g:选择i18n

Mysql显示全部不只是选择

MYSQL获取逆序限制为6

sql - 使用 UNION 时如何返回源表名称?

mysql - 为什么执行2次插入的查询无法执行?

php - 比较2个表中的2个字段并提取数据

php - 循环查询 10'000 次以上的最佳方法?

c# - LINQ SELECT 中的 IF 语句包含列

python - Django 中的 MYSQL 查询等效项

mysql - 如何组合三个选择查询,每个查询都排除前一个查询的结果?