首页 > 解决方案 > 多重联接以排除第二个联接中的第一个联接的结果

问题描述

我使用 Spring JPA。我有一个需要支付的交易实体 Transaction。这些支出记录在另一个支出实体 PayoutTransaction 中。它们与多对多关系相关联。有时支付失败,他们会重新尝试添加一个新的 PayoutTransaction 条目,这通常是可以的。我需要获取支付失败的交易,但不包括那些支付成功的失败交易,因为即使第一次尝试失败,它们也已成功支付(他们在 PayoutTransaction 实体中有另一个条目,状态为 OK)。我已经尝试过在两个表之间进行多次 JOIN,但它包括交易,即使他们有一个好的支付。(我知道这是预期的行为)我该如何解决这个问题?

SELECT distinct t FROM Transaction t JOIN t.payoutTransactions p JOIN t.payoutTransactions p2 where p.status = 'FAILED' and NOT p2.status = 'OK'

标签: spring-bootjpaspring-data-jpa

解决方案


你可以在这里试试EXISTS

SELECT distinct t FROM Transaction t JOIN t.payoutTransactions p
where p.status = 'FAILED' AND exists (SELECT p2
 payoutTransactions p2 where p2.status = p.status and p2.status <> 'OK')

或者您甚至可以编写如下本机查询,

SELECT t.* FROM Transaction t join payoutTransaction p on t.ID = p.ID
 where p.status = 'FAILED' AND exists 
(SELECT 1 FROM payoutTransaction p2 where p2.status = p.status and p2.status <> 'OK' )

推荐阅读