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
我正在尝试在高度规范化的数据库上构建查询,其中许多客户字段和值保存在不同的 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