sql - 按主键所具有的行数进行过滤

标签 sql sql-server

我有一个查询,有时会返回不需要的行。

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

enter image description here

图片上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/

相关文章:

sql-server - 没有 SSL 证书的 SQL Server 2012 ForceEncryption?

sql-server - SQL Azure - 登录后阶段超时时间已过

sql - T-SQL 条件查询

mysql - MySQL 中何时使用单引号、双引号和反引号

mysql - 2 个不同的表是否应该共享相同的点赞/投票表

sql - 如何使用一个 SQL 查询从数据库中删除所有表?

SQL IsNumeric 返回 True,但 SQL 报告 'Conversion Failed'

sql-server - 命名实例的 mssql Node 问题

MySQL,获取两个查询的总和

sql - 满足条件的 COUNT 行(在具有特定条件的行处重置)