MySQL 子查询结果,但也在其上放置条件

MySQL subquery result but place criteria on it as well

我正在尝试在高度规范化的数据库上构建查询,其中许多客户字段和值保存在不同的 table 中。这意味着我已经为 return 自定义字段中的值创建了一个子查询:

SELECT
LA.ID
,GRP.GROUPNAME
,LP.PRODUCTNAME
,LA.ACCOUNTSTATE
,(LA.FEESBALANCE+LA.PENALTYBALANCE+LA.INTERESTBALANCE+LA.PRINCIPALBALANCE) AS ACCOUNTBALANCE
,AD.POSTCODE
,       (SELECT cv.`VALUE` as vl FROM customfieldvalue cv   JOIN customfield cf on cv.CUSTOMFIELDKEY = cf.ENCODEDKEY    
        WHERE LA.ENCODEDKEY = cv.PARENTKEY AND cf.ID = 'ON_Watch_List_Corporate') as 'watchstatus'
,       (SELECT cv.`VALUE` as vl FROM customfieldvalue cv   JOIN customfield cf on cv.CUSTOMFIELDKEY = cf.ENCODEDKEY    
        WHERE LA.ENCODEDKEY = cv.PARENTKEY AND cf.ID = 'ON_RI-07') as 'PROVISIONAMOUNT'
,       (SELECT cv.`VALUE` as vl FROM customfieldvalue cv   JOIN customfield cf on cv.CUSTOMFIELDKEY = cf.ENCODEDKEY    
        WHERE LA.ENCODEDKEY = cv.PARENTKEY AND cf.ID = 'ON_Security/Collateral_GV') as 'SECUITY/COLLATERAL'
,       (SELECT cv.`VALUE` as vl FROM customfieldvalue cv   JOIN customfield cf on cv.CUSTOMFIELDKEY = cf.ENCODEDKEY    
        WHERE LA.ENCODEDKEY = cv.PARENTKEY AND cf.ID = 'ON_Property_Current_Value') as 'PROPERTYVALUE'


FROM

 LOANACCOUNT LA
,LOANPRODUCT LP
,group GRP
,CUSTOMFIELD CF
,CUSTOMFIELDVALUE CV
,ADDRESS AD
,ACTIVITY AT


WHERE

LA.PRODUCTTYPEKEY = LP.ENCODEDKEY
AND LA.ACCOUNTHOLDERKEY = GRP.ENCODEDKEY
AND GRP.ENCODEDKEY = AD.PARENTKEY

但是,我还需要在 WHERE 条件中包含字段 PROVISIONAMOUNT - 即大于 0。

抱歉,如果这很明显,但我是 SQL 的新手,我找不到任何可以证明是否可以做到的东西。

感谢任何可能对此提供帮助的人。

为什么不在 where 子句中添加条件。

WHERE
LA.PRODUCTTYPEKEY = LP.ENCODEDKEY
AND LA.ACCOUNTHOLDERKEY = GRP.ENCODEDKEY
AND GRP.ENCODEDKEY = AD.PARENTKEY
AND PROVISIONAMOUNT > 0

看了你的查询一段时间后,我认为它可以重写如下,它在功能上应该是等价的,但添加了条件 PROVISIONAMOUNT > 0 。它应该更易于阅读并且性能也更好。

在原始版本中,您包含了 table ACTIVITY AT,但我看不到它在任何地方被使用,所以我删除了它。

这应该可行,除非我遗漏了一些重要的细节。请试一试,如果不起作用我会删除我的答案。

SELECT
    LA.ID
    , GRP.GROUPNAME
    , LP.PRODUCTNAME
    , LA.ACCOUNTSTATE
    , (LA.FEESBALANCE+LA.PENALTYBALANCE+LA.INTERESTBALANCE+LA.PRINCIPALBALANCE) AS ACCOUNTBALANCE
    , AD.POSTCODE
    , MAX(CASE WHEN cf.ID = 'ON_Watch_List_Corporate' THEN cv.value END) AS 'watchstatus'
    , MAX(CASE WHEN cf.ID = 'ON_RI-07' THEN cv.value END) AS 'PROVISIONAMOUNT'
    , MAX(CASE WHEN cf.ID = 'ON_Security/Collateral_GV' THEN cv.value END) AS 'SECUITY/COLLATERAL'
    , MAX(CASE WHEN cf.ID = 'ON_Property_Current_Value' THEN cv.value END) AS 'PROPERTYVALUE'

FROM
    LOANACCOUNT LA 
JOIN 
    LOANPRODUCT LP ON LA.PRODUCTTYPEKEY = LP.ENCODEDKEY
JOIN 
    "group" GRP ON LA.ACCOUNTHOLDERKEY = GRP.ENCODEDKEY
JOIN 
    "ADDRESS" AD ON GRP.ENCODEDKEY = AD.PARENTKEY
JOIN 
    customfieldvalue cv ON LA.ENCODEDKEY = cv.PARENTKEY 
JOIN 
    customfield cf ON cv.CUSTOMFIELDKEY = cf.ENCODEDKEY 

GROUP BY
    LA.ID
    , GRP.GROUPNAME
    , LP.PRODUCTNAME
    , LA.ACCOUNTSTATE
    , (LA.FEESBALANCE+LA.PENALTYBALANCE+LA.INTERESTBALANCE+LA.PRINCIPALBALANCE) 
    , AD.POSTCODE
HAVING MAX(CASE WHEN cf.ID = 'ON_RI-07' THEN cv.value END) > 0