sql将子查询更改为联接

bz4sfanl  于 2021-08-13  发布在  Java
关注(0)|答案(4)|浏览(372)

我有下面的查询,它有一个子查询。我需要将子查询转换为一个join,并用一个单独的where子句表示日期,它将在excel spreasheet中参数化。

  1. select me.id, me.merchant_num, me.merchant_nm,
  2. (select count(1) from transaction_t where merchant_id = me.id and transaction_dt BETWEEN '2020-04-01' and '2020-04-30') as num_transactions
  3. FROM merchant_t me
  4. left outer join transaction_t tt on tt.merchant_id = me.id
  5. where me.status = 'T'

子查询获取给定日期之间所有商户交易的计数。我已经试了所有我能想到的,但我要么得到太多的行或其他一些事情是错误的。
涉及两个表:

  1. merchant_t
  2. ----------
  3. id merchant_num merchant_nm status
  4. transaction_t
  5. --------------
  6. id merchant_id transaction_dt
mrfwxfqh

mrfwxfqh1#

这应该起作用:

  1. SELECT me.id, me.merchant_num, me.merchant_nm, count(1) as num_transactions
  2. FROM merchant_t me
  3. LEFT OUTER JOIN transaction_t
  4. ON t.merchant_id = me.id
  5. AND t.transaction_dt BETWEEN '2020-04-01' and '2020-04-30'
  6. WHERE me.status = 'T'
  7. GROUP BY me.id, me.merchant_num, me.merchant_nm
kgqe7b3p

kgqe7b3p2#

你可以试试下面的逻辑-

  1. select me.id,
  2. me.merchant_num,
  3. me.merchant_nm,
  4. count(tt.merchant_id) as num_transactions
  5. FROM merchant_t me
  6. left outer join transaction_t tt
  7. on tt.merchant_id = me.id
  8. and tt.transaction_dt BETWEEN '2020-04-01' and '2020-04-30'
  9. and me.status = 'T'
  10. group by me.id,
  11. me.merchant_num,
  12. me.merchant_nm
6kkfgxo0

6kkfgxo03#

请使用下面的查询,

  1. select me.id, me.merchant_num, me.merchant_nm, qry.num_transactions from merchant_t me
  2. left outer join (select merchant_id, count(1) as num_transactions from transaction_t where transaction_dt BETWEEN '2020-04-01' and '2020-04-30' group by merchant_id) qry
  3. on (me.id = qry.merchant_id)
  4. where me.status = 'T';

您也可以使用下面的查询,

  1. select me.id, me.merchant_num, me.merchant_nm, qry.num_transactions, count(1) from merchant_t me
  2. left outer join transaction_t qry
  3. on (me.id = qry.merchant_id)
  4. where me.status = 'T'
  5. group by me.id, me.merchant_num, me.merchant_nm, qry.num_transactions;
w7t8yxp5

w7t8yxp54#

你的问题其实很好。几乎。你有一个不必要的 JOIN 在外部查询中:

  1. select me.id, me.merchant_num, me.merchant_nm,
  2. (select count(1)
  3. from transaction_t
  4. where t.merchant_id = me.id and
  5. t.transaction_dt between '2020-04-01' and '2020-04-30'
  6. ) as num_transactions
  7. from merchant_t me
  8. where me.status = 'T';

尽管你要求 left join ,此版本可能具有更好的性能(在 transact_t(merhant_id, transaction_dt) 因为它避免了外部聚集。

相关问题