我有两张桌子:授权和和解."结算"包含授权的外键引用.
结算也可以具有状态(ERROR,ACCEPTED等).
鉴于此数据:
Authorizations Settlements id id | auth_id | status ----- --------------------------- 1 1 1 ERROR 2 2 1 ACCEPTED
我正在尝试编写SQL查询以查找没有ACCEPTED结算记录的所有授权.我尝试过LEFT OUTER JOIN,但它返回太多行.例如:
SELECT * FROM authorizations a
LEFT OUTER JOIN settlements s ON a.id = s.auth_id
WHERE s.status is null OR s.status != 'ACCEPTED'
这样做的问题是,如果它有多个结算记录,它仍将返回授权记录,其中一个是已接受的.或者,如果有多个ERROR记录,则授权将返回两次.
如何才能获取没有状态为"已接受"的相应结算记录的单个授权记录?是否可以使用直接SQL,或者我是否必须在我的代码中过滤结果?
SELECT *
FROM authorizations a
WHERE NOT EXISTS
(
SELECT NULL
FROM Settlements s
WHERE s.auth_id = a.id
AND s.status = 'ACCEPTED'
)
Run Code Online (Sandbox Code Playgroud)