Sql 在具有Group By的子查询中使用IN运算符
我在一个问题上遇到了一些麻烦。我应该调出所有客户信息,客户只参加了一次测试并通过了测试。我被告知使用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
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是用于聚合函数的。它支持非聚合功能,但并不意味着应该使用它。