过滤LEFT JOIN结果

Mik*_*keQ 2 sql left-join

我有两张桌子:授权和和解."结算"包含授权的外键引用.

结算也可以具有状态(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,或者我是否必须在我的代码中过滤结果?

Qua*_*noi 7

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)