【问题标题】:SQL change subquery to joinSQL 更改子查询以加入
【发布时间】:2020-05-28 09:05:10
【问题描述】:

我有以下查询,它有一个子查询。我需要将子查询转换为带有日期分隔的“where”子句的连接,这将在 Excel 电子表格中进行参数化。

    select me.id, me.merchant_num, me.merchant_nm,
    (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
    FROM merchant_t me
    left outer join transaction_t tt on tt.merchant_id = me.id
    where me.status = 'T'

子查询获取给定日期之间所有商家交易的计数。 我已经尝试了所有我能想到的方法,但要么我得到的行太多,要么有其他问题。

涉及两个表:

merchant_t
----------
id     merchant_num    merchant_nm    status


transaction_t
--------------
id     merchant_id     transaction_dt

【问题讨论】:

    标签: sql sql-server


    【解决方案1】:

    这应该可行:

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

    【讨论】:

      【解决方案2】:

      你可以试试下面这个逻辑-

      select me.id, 
      me.merchant_num, 
      me.merchant_nm,
      count(tt.merchant_id) as num_transactions
      FROM merchant_t me
      left outer join transaction_t tt 
          on tt.merchant_id = me.id
          and tt.transaction_dt BETWEEN '2020-04-01' and '2020-04-30'
          and me.status = 'T'
      group by me.id, 
      me.merchant_num, 
      me.merchant_nm
      

      【讨论】:

        【解决方案3】:

        请使用以下查询,

        select me.id, me.merchant_num, me.merchant_nm, qry.num_transactions from merchant_t me
        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
        on (me.id = qry.merchant_id)
        where me.status = 'T';
        

        您也可以使用以下查询,

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

        【讨论】:

          【解决方案4】:

          您的查询实际上很好。 . .几乎。您在外部查询中有一个不必要的JOIN

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

          虽然您要求left join,但此版本可能具有更好的性能(在transact_t(merhant_id, transaction_dt) 上有一个索引,因为它避免了外部聚合。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2016-04-17
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-02-07
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多