【问题标题】:Sqlite SUM Entity value depending on LEFT JOIN valueSqlite SUM 实体值取决于 LEFT JOIN 值
【发布时间】:2019-08-21 08:31:09
【问题描述】:

我在 Android 上使用 Room 来查询 POJO。

我的 POJO(事务)包含一个 value 和一个 account_id。它还包含一个account(帐户实例),由@Relation 获取。

事务类:

@Parcelize
class Transaction(
    @Embedded val entity: TransactionEntity,
    @Relation(entity = Account::class, parentColumn = Database.Transactions.COL_ACCOUNT_ID, entityColumn = Database.Accounts.COL_ID) val account: Account? = null
) : Model

帐户属性:

data class Account(
    @PrimaryKey(autoGenerate = true) @ColumnInfo(name = Database.Accounts.COL_ID) val id: Long = 0,
    @ColumnInfo(name = Database.Accounts.COL_NAME) val name: String = "",
    @ColumnInfo(name = Database.Accounts.COL_BALANCE) val balance: Double = 0.0
)

accounts.balance 不是数据库中的值,而是属于该帐户的所有 transactions.value 的总和。

所以我需要对每个transaction.value 求和,其中transaction.account_id = account.id

它应该与这种方式类似,但我没有做对:

@androidx.room.Transaction
@Query(
    """
        SELECT transactions.* FROM transactions
        LEFT OUTER JOIN (SELECT transactions.value, SUM(transactions.value) AS balance FROM accounts) ON transactions.account_id = accounts.id
        GROUP BY transactions.id
"""
)
fun getTrs(): List<Transaction>

【问题讨论】:

  • LEFT JOIN(而不是INNER JOIN)的原因是什么?
  • 假设您想要一个已知帐户的余额,为什么不简单地 select sum(t.value) from transactions t where t.id = 'myknownaccounid' 呢?
  • 如果你想要一些全球性的东西。 select t.id, sum(t.value) from transactions group by t.id;
  • 我不需要关节。
  • @Tuckbros 抱歉回答迟了,我想要一个 Account 对象,其中包含相关交易的总和/余额。这就是我认为需要 JOIN 的原因。

标签: android sql sqlite android-sqlite android-room


【解决方案1】:

试试这个:

@androidx.room.Transaction
@Query(
    """
        SELECT transactions.* FROM transactions
        LEFT OUTER JOIN (SELECT transactions.value, SUM(transactions.value) AS balance FROM accounts GROUP BY transactions.id) ON transactions.account_id = accounts.id 
"""
)
fun getTrs(): List<Transaction> 

【讨论】:

    【解决方案2】:

    您已经在 GROUP BY 子句中列出了表事务的所有必要列。

    SELECT transactions.* SUM(transactions.value) AS balance
    FROM transactions
    LEFT JOIN accounts ON transactions.account_id = accounts.id
    GROUP BY ...transactions.id, transactions.account_id.... and all necessary columns of transactions table...
    

    希望对你有所帮助!

    【讨论】:

      【解决方案3】:

      你可以使用子查询:

      SELECT t.*,(SELECT SUM(transactions.value) FROM accounts a ON t.account_id = a.id) AS balance
      FROM transactions t
      

      【讨论】:

        【解决方案4】:

        让它干净: 首先创建一个余额视图

        CREATE VIEW v_balance AS 
        SELECT account_id, SUM(value) as account_balance
        FROM transactions 
        GROUP BY account_id
        

        然后根据需要使用左连接中的视图:

        SELECT account.*, IFNULL(v_balance.account_balance, 0.0) 
        FROM account
        LEFT JOIN v_balance ON v_balance.account_id = account.id
        

        【讨论】:

          【解决方案5】:

          大概意思是这样的:

          SELECT a.*, SUM(t.value) AS balance
          FROM transactions t
          LEFT JOIN accounts a
          ON a.account_id = t.account_id
          GROUP BY t.account_id
          

          【讨论】:

            【解决方案6】:

            我通过创建一个新的 POJO 来包装我的原始帐户对象,但为现在查询的总和添加了一个字段。

            @Query(
                """
                    SELECT accounts.*, 
                    (SELECT SUM(CASE WHEN transactions.type = ${Transaction.TransactionType.EARNING} THEN transactions.value 
                    ELSE -transactions.value END) FROM transactions WHERE transactions.account_id = accounts.id) AS balance
                    FROM accounts
                    LEFT JOIN transactions ON transactions.account_id = accounts.id
                    GROUP BY accounts.id
                """
            )
            fun getAccountsWithBalance(): LiveData<List<AccountWithBalance>>
            

            【讨论】:

              猜你喜欢
              • 2020-03-20
              • 2019-08-23
              • 2021-11-21
              • 2021-09-12
              • 1970-01-01
              • 1970-01-01
              • 2020-06-10
              • 2021-01-30
              • 1970-01-01
              相关资源
              最近更新 更多