Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/184.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android Sqlite和实体值取决于左连接值_Android_Sql_Sqlite_Android Sqlite_Android Room - Fatal编程技术网

Android Sqlite和实体值取决于左连接值

Android Sqlite和实体值取决于左连接值,android,sql,sqlite,android-sqlite,android-room,Android,Sql,Sqlite,Android Sqlite,Android Room,我正在使用Android上的Room查询POJO My POJO事务包含一个值和一个account_id。它还包含account的account实例,该实例由@Relation获取 事务类: @Parcelize class Transaction( @Embedded val entity: TransactionEntity, @Relation(entity = Account::class, parentColumn = Database.Transactions.COL

我正在使用Android上的Room查询POJO

My POJO事务包含一个值和一个account_id。它还包含account的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\u 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>
试试这个:

试试这个:


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

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...

我希望我帮助了你

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

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...

我希望我帮助了你

您可以使用子查询:

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

您可以使用子查询:

SELECT t.*,(SELECT SUM(transactions.value) FROM accounts a ON t.account_id = a.id) AS balance
FROM transactions t
把它弄干净: 首先创建一个平衡视图

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
把它弄干净: 首先创建一个平衡视图

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

它的意思可能与此相似:

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

它的意思可能与此相似:

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

我创建了一个新的POJO,它包装了我原来的account对象,但为现在查询的sum添加了一个字段

@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>>

我创建了一个新的POJO,它包装了我原来的account对象,但为现在查询的sum添加了一个字段

@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>>

与内部联接相反,左联接的原因是什么?假设您想要一个已知帐户的余额,为什么不简单地从事务t中选择sumt.value,其中t.id='myknownaconId'?如果您想要全局的东西。按t.id从交易组中选择t.id、sumt.value;我不需要联名。@Tuckbros很抱歉回答得太晚,我想要一个账户对象,其中包含关联交易的总额/余额。这就是为什么我认为需要一个联接。左联接而不是内部联接的原因是什么?假设您想要一个已知帐户的余额,为什么不简单地从事务t中选择sumt.value,其中t.id='myknownaconId'?如果您想要全局的东西。按t.id从交易组中选择t.id、sumt.value;我不需要联名。@Tuckbros很抱歉回答得太晚,我想要一个账户对象,其中包含关联交易的总额/余额。这就是我认为需要加入的原因。