sql查询简化(解释成本58)

izj3ouym  于 2021-06-20  发布在  Mysql
关注(0)|答案(2)|浏览(696)

有人能帮忙简化下面的问题吗。它的成本显示为58。
b、 duedate和b.tid是复合键。a、 tid是表1和表2之间的主键和外键。

  1. SELECT test.tID, test.sor_acct_id, test.pmt, test.status FROM ct.tab1 a,
  2. (SELECT a.tID, a.sor_acct_id, b.dueDate, b.amt, b.status, a.pmt,
  3. Row_number() OVER ( partition BY a.tID ORDER BY b.dueDate DESC) AS rn
  4. FROM ct.tab1 a
  5. INNER JOIN ct.tab2 b
  6. ON a.tID = b.tID
  7. WHERE a.tID IN (SELECT a.tID
  8. FROM ct.tab1 a
  9. INNER JOIN
  10. ct.tab2 b
  11. ON a.tID =
  12. b.tID
  13. WHERE a.status = 'E'
  14. AND a.pmt IS NOT NULL
  15. AND a.pmt <> '{}'
  16. AND b.dueDate > CURRENT_DATE - 4
  17. AND b.dueDate < CURRENT_DATE)
  18. AND b.dueDate > CURRENT_DATE - 1
  19. ) test WHERE rn = 1
  20. AND test.status IN ( 'X', 'Z' )
  21. AND a.tID = test.tID
cyvaqqii

cyvaqqii1#

tID 是tab1的主键。所以当你说你在找 tab1 记录 tID 在一组 tab1 状态为e的记录,你也可以简单地说:我在找 tab1 状态为e的记录。
您的查询所做的是:全部显示 tab1 最后的记录 tab2 提供的状态。。。
这个 tab1 pmt不为null且不是{}
这个 tab1 状态为e
决赛 tab2 状态为x或z
决赛 tab2 状态是今天或将来到期的
至少存在一个 tab2 最近三天内到期的 tab1 记录
查询:

  1. SELECT
  2. t1.tID,
  3. t1.sor_acct_id,
  4. t1.pmt,
  5. t2.status
  6. FROM ct.tab1 t1
  7. join
  8. (
  9. SELECT
  10. tID,
  11. status,
  12. ROW_NUMBER() OVER (PARTITION BY tID ORDER BY dueDate DESC) AS rn
  13. FROM ct.tab2
  14. WHERE dueDate > CURRENT_DATE - 1
  15. ) t2 ON t2.tID = tab1.tID AND t2.rn = 1 AND t2.status IN ('X', 'Z')
  16. WHERE t1.status = 'E'
  17. AND t1.pmt IS NOT NULL
  18. AND t1.pmt <> '{}'
  19. and t1.tID IN
  20. (
  21. SELECT tID
  22. FROM ct.tab2
  23. WHERE dueDate > CURRENT_DATE - 4
  24. AND dueDate < CURRENT_DATE
  25. );
展开查看全部
sc4hvdpw

sc4hvdpw2#

也许你会改变:

  1. WHERE a.tID IN (SELECT a.tID ....

分为:

  1. join ((SELECT a.tID FROM ct.tab1 a ....) t on t.tID=a.tID

相关问题