我在查询时遇到了一些麻烦。我应该提取所有客户端信息,客户端只进行了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之外我不应该有任何其他条目。我该如何解决这个问题?
答案 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}}。