在Subquery中使用IN运算符和Group By

时间:2013-02-12 05:10:54

标签: sql oracle aggregate-functions ora-00913

我在查询时遇到了一些麻烦。我应该提取所有客户端信息,客户端只进行了1次测试并通过了。有人告诉我使用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之外我不应该有任何其他条目。我该如何解决这个问题?

2 个答案:

答案 0 :(得分:4)

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

SELECT  *
FROM    Client
WHERE   ClientName IN
        (
            SELECT  ClientName
            FROM    Test
            GROUP   BY ClientName, TestResult
            HAVING  COUNT(TestNbr) = 1 AND TestResult='Pass'
        );

但我宁愿使用JOIN而不是IN

SELECT  DISTINCT a.*
FROM    Client a
        INNER JOIN
        (
            SELECT  ClientName
            FROM    Test
            GROUP   BY ClientName, TestResult
            HAVING  COUNT(TestNbr) = 1 AND TestResult='Pass'
        ) b ON a.ClientName = b.ClientName

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

答案 1 :(得分:2)

如果使用子查询,IN子句只能包含一列。如果出现问题,您应该从所选列中删除COUNT

您可能想要做的是创建一个代表子查询的VIEW,然后针对该JOIN创建{{1}}。