1

我在查询时遇到了一些问题。我应该调出客户只参加了 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 之外的任何其他条目。我该如何解决这个问题?

4

2 回答 2

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为了获得更快的性能,请在两个表的列上添加索引。

于 2013-02-12T05:14:14.937 回答
2

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

您可能想要做的是制作一个VIEW代表子查询的 a,然后JOIN反对它。

于 2013-02-12T05:12:57.780 回答