2013-02-12 67 views
1

我在查詢時遇到了一些麻煩。我應該把所有的客戶端信息放在客戶端只有1次測試通過的地方。我被告知使用IN運營商。這是我有:在子查詢中使用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

刪除COUNT(*)列的子查詢,因爲它不是對結果neccesary,

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上的索引。

+0

謝謝!這工作 – Cyrallia 2013-02-12 05:15:34

+0

不客氣':D'我已經更新了答案。 – 2013-02-12 05:17:07

+1

不確定我在這裏購買內嵌視圖,因爲您沒有使用任何字段。另外,我想我會將testresult ='Pass''從'having'放入'where'中並從'group by'中移除testresult' – 2013-02-12 05:20:13

2

如果使用子查詢,則IN子句只能包含一列。如果出現問題,您應該從所選列中刪除COUNT

你可能想要做的是做一個VIEW代表子查詢,然後JOIN反對。

+0

製作非物化視圖沒有任何好處。如果有的話,封裝是不好的,可能不會發生謂詞推送。 – 2013-02-12 05:20:11

+0

我一直首選'SELECT ClientName FROM ClientsWithPassingTestResults'到'SELECT ClientName FROM ...'和一大堆SQL。也許這只是我。 – tadman 2013-02-12 05:26:58

+0

表現勝過偏好。 – 2013-02-12 05:28:13

相關問題