Sql 在具有Group By的子查询中使用IN运算符

Sql 在具有Group By的子查询中使用IN运算符,sql,oracle,aggregate-functions,ora-00913,Sql,Oracle,Aggregate Functions,Ora 00913,我在一个问题上遇到了一些麻烦。我应该调出所有客户信息,客户只参加了一次测试并通过了测试。我被告知使用IN操作符。这就是我所拥有的: SELECT * FROM Client WHERE ClientName IN (SELECT ClientName, COUNT(TestNbr) FROM Test GROUP BY ClientName, TestResult

我在一个问题上遇到了一些麻烦。我应该调出所有客户信息,客户只参加了一次测试并通过了测试。我被告知使用IN操作符。这就是我所拥有的:

SELECT *
  FROM Client
 WHERE ClientName IN (SELECT ClientName, COUNT(TestNbr)
                        FROM Test
                    GROUP BY ClientName, TestResult
                      HAVING COUNT(TestNbr)=1
                         AND TestResult='Pass');
我得到这个错误:

(SELECT ClientName, COUNT(TestNbr)
 *
ERROR at line 4: 
ORA-00913: too many values
我理解这是因为除了ClientName之外,我不应该在该行中有任何其他条目。我如何解决这个问题

如果使用子查询,IN子句只能包含一列。如果出现问题,应删除所选列的计数

您可能要做的是创建一个表示子查询的视图,然后根据该视图进行联接。

如果使用子查询,IN子句只能包含一列。如果出现问题,应删除所选列的计数

您可能要做的是创建一个表示子查询的视图,然后根据该视图进行联接。

删除子查询上的COUNT*列,因为它对结果不是必需的

SELECT  *
FROM    Client
WHERE   ClientName IN
        (
            SELECT  ClientName
            FROM    Test
            GROUP   BY ClientName, TestResult
            HAVING  COUNT(TestNbr) = 1 AND TestResult='Pass'
        );
但是我宁愿使用JOIN而不是IN

为了提高性能,请在两个表的ClientName列上添加索引。

删除子查询上的COUNT*列,因为它在结果上不是必需的

SELECT  *
FROM    Client
WHERE   ClientName IN
        (
            SELECT  ClientName
            FROM    Test
            GROUP   BY ClientName, TestResult
            HAVING  COUNT(TestNbr) = 1 AND TestResult='Pass'
        );
但是我宁愿使用JOIN而不是IN


为了提高性能,请在两个表的ClientName列上添加索引。

创建非物化视图没有任何好处。如果有的话,封装是错误的,谓词推送可能不会发生。我一直倾向于从ClientsWithPassingTestResults中选择ClientName以从。。。以及相当混乱的SQL。也许只有我一个人。制作一个非物化视图没有任何好处。如果有的话,封装是错误的,谓词推送可能不会发生。我一直倾向于从ClientsWithPassingTestResults中选择ClientName以从。。。以及相当混乱的SQL。也许只有我一个人。我不确定我在这里买了内联视图,因为你没有使用它的任何字段。此外,我认为我应该将testresult='Pass'从组中移出,并将其放在where中,然后从组中移除testresult,因为我同意Conrad的观点,having是用于聚合函数的。它支持非聚合功能,但并不意味着应该使用它。我不确定我在这里购买内联视图,因为你没有使用它的任何字段。此外,我认为我应该将testresult='Pass'从组中移出,并将其放在where中,然后从组中移除testresult,因为我同意Conrad的观点,having是用于聚合函数的。它支持非聚合功能,但并不意味着应该使用它。