在 select 语句中的 LEFT JOIN 之前使用 WHERE 子句
use WHERE clause before LEFT JOIN in a select statement
我有下面的代码,希望就如何在左连接之前使用 'where' 子句获得一些帮助 - 我有一个包含大量数据的 table 但需要在我 return 我想要的 select 语句的结果之前,通过薪水选项过滤它。请参阅下面的代码,在此先感谢。
此外,执行时间非常长。 6 分钟以上,对于只有 70 或 80 条记录的 table。我编写查询的方式可能有问题吗?谢谢
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;
我有下面的代码,希望就如何在左连接之前使用 'where' 子句获得一些帮助 - 我有一个包含大量数据的 table 但需要在我 return 我想要的 select 语句的结果之前,通过薪水选项过滤它。请参阅下面的代码,在此先感谢。
此外,执行时间非常长。 6 分钟以上,对于只有 70 或 80 条记录的 table。我编写查询的方式可能有问题吗?谢谢
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;