2012-07-03 41 views
0

我在下面的代碼中遇到了一個奇怪的錯誤。 No column was specified for column 2 of 'no1'. 據我可以告訴它應該工作。我只是試圖獲得關於客戶在收據tbl上不止一次存在的客戶的詳細信息。抓取出現多次的客戶的詳細信息

SELECT 
    CM.ClientID, 
    CPN.Birthdate, 
    CM.ClientPassword 
FROM 
    dbo.ClientMaster AS CM 
    JOIN dbo.ClientPerson AS CPN ON (CM.ClientID = CPN.ClientID) 
    JOIN dbo.ClientProduct AS CP ON (CPN.ClientID = CP.ClientID) 
WHERE 
    CM.ClientID IN (
        SELECT 
         no1.ClientID 
        FROM 
         (
         SELECT 
          CM.ClientID, 
          COUNT(*) 
         FROM 
          dbo.ClientMaster AS CM 
          JOIN dbo.ClientPerson AS CPN ON (CM.ClientID = CPN.ClientID) 
          JOIN dbo.ClientProduct AS CP ON (CPN.ClientID = CP.ClientID) 
         WHERE 
          CP.PolicyNo IN (SELECT PolicyNo FROM Receipts) 
          AND CM.ClientID IS NOT NULL 
          AND Birthdate IS NOT NULL 
          AND ClientPassword IS NOT NULL 
         GROUP BY 
          CM.ClientID 
         HAVING 
          COUNT(*)>1 
         ) AS no1 
        ) 

SOLUTION

啊沒想到你不需要Count(*)Select。多謝你們! 這就是我最終選擇的。

SELECT DISTINCT 
    CM.ClientID, 
    CPN.Birthdate, 
    CM.ClientPassword 
FROM 
    dbo.ClientMaster AS CM 
    JOIN dbo.ClientPerson AS CPN ON (CM.ClientID = CPN.ClientID) 
    JOIN dbo.ClientProduct AS CP ON (CPN.ClientID = CP.ClientID) 
WHERE 
    CM.ClientID IN (
         SELECT 
          ClientID 
         FROM 
          Receipts 
         GROUP BY 
          ClientID 
         HAVING 
          COUNT(*)>1 
         ) 
    AND CM.ClientID IS NOT NULL 
    AND Birthdate IS NOT NULL 
    AND ClientPassword IS NOT NULL 

回答

2

你的COUNT(*)列需要一個名稱,如:

COUNT(*) AS RecordCount 
+0

事實上,你甚至不需要此列在結果集中,因爲你只ClientID的興趣,而你在HAVING子句中使用COUNT(*) - 所以不需要將它作爲選定的列返回 – Sean

+0

@MahmoudGamal他可以將它放在HAVING部分中,並從SELECT部分​​省略它。 – Sean

+1

您可以通過刪除不必要的嵌套級別來進一步改善查詢。你目前得到:'WHERE X in(SELECT X FROM(SELECT X GROUPBY + HAVING))'。你只需要:'在哪裏X(SELECT X GROUPBY + HAVING)' – Sean

1

你不需要巢相同的查詢兩次了點。你可以這樣做,而不是:

SELECT 
    CM.ClientID, 
    CPN.Birthdate, 
    CM.ClientPassword 
FROM 
    dbo.ClientMaster AS CM 
    JOIN dbo.ClientPerson AS CPN ON (CM.ClientID = CPN.ClientID) 
    JOIN dbo.ClientProduct AS CP ON (CPN.ClientID = CP.ClientID) 
GROUP BY CM.ClientID, CPN.Birthdate, CM.ClientPassword 
HAVING COUNT(CM.ClientID) > 1 
+0

有趣。你爲什麼將所有三列進行分組? – windowskm

+1

@killianmcc,通常,當您通過特定列設置結果集的GROUP BY時,需要確定您需要對結果集中不在組中的其他列執行什麼操作,並且您有兩個選項:use對於不在group by中的每列的聚合函數,或者將它包括在group by子句中。如果從GROUP BY子句中刪除兩列並將它們留在SELECT語句中,則會出現錯誤,這就是爲什麼我將它們包含在group by子句中的原因。 –