我有一个查询,有时会返回不需要的行。
SELECT TOP 100 PERCENT
ca.item_id, ca.FIELD_ID, ca.attr_val, ca.upd_dtt, ca.upd_usr
FROM
contract_attr ca
WHERE
EXISTS (SELECT 1
FROM contract_attr ca_326
WHERE ca.item_id = ca_326.item_id
AND ca_326.field_id = 326
AND ca_326.ATTR_VAL = 'Y')
UNION ALL
SELECT
ca.item_id, 9999, mf.[ITEM_NAME], '', ''
FROM
mfr mf
JOIN
contract_attr ca ON ca.attr_val = mf.[ITEM_PK]
ORDER BY
ca.item_id
图片上item_id的10-13只有1行。
我想从查询中过滤这些行。查了一下我应该添加一个:
SELECT TOP 100 PERCENT
ca.item_id, ca.FIELD_ID, ca.attr_val, ca.upd_dtt, ca.upd_usr
FROM
contract_attr ca
WHERE
EXISTS (SELECT 1
FROM contract_attr ca_326
WHERE ca.item_id = ca_326.item_id
AND ca_326.field_id = 326
AND ca_326.ATTR_VAL = 'Y')
UNION ALL
SELECT
ca.item_id, 9999, mf.[ITEM_NAME], '', ''
FROM
mfr mf
JOIN
contract_attr ca ON ca.attr_val = mf.[ITEM_PK]
HAVING
COUNT(ca.item_id) > 1
ORDER BY
ca.item_id
但是我收到此错误并且不明白为什么:
Column 'contract_attr.ITEM_ID' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.
我做错了什么以及如何解决它?
最佳答案
由于您想要返回多列,而这无法通过having所需的分组来完成,因此您可以在子查询中使用having。
SELECT TOP 100 PERCENT
ca.item_id
,ca.FIELD_ID
,ca.attr_val
,ca.upd_dtt
,ca.upd_usr
FROM contract_attr ca
WHERE EXISTS (
SELECT 1
FROM contract_attr ca_326
WHERE ca.item_id = ca_326.item_id
AND ca_326.field_id = 326
AND ca_326.ATTR_VAL = 'Y'
)
UNION ALL
SELECT ca.item_id
,9999
,mf.[ITEM_NAME]
,''
,''
FROM mfr mf
JOIN contract_attr ca ON ca.attr_val = mf.[ITEM_PK]
INNER JOIN(SELECT item_id FROM contract_attr group by item_id having count(item_id) > 1) x on x.item_id = ca.item_id
ORDER BY ca.item_id
关于sql - 按主键所具有的行数进行过滤,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44120783/