2012-07-03 5 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 
        ) 

해결하는 것은

아 당신이 SelectCount(*) 필요하지 않습니다 몰랐어요. 고마워요! 이것이 결국 내가 끝내게 된 것입니다. 당신은 그 두 번 둥지에 동일한 쿼리가 필요하지 않습니다

COUNT(*) AS RecordCount 

답변

2

귀하의 COUNT (*) 열은 같은 이름이 필요합니다. 대신이 작업을 수행 할 수 있습니다

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

는 사실, 당신도 당신이 된 ClientID에만 관심이있다, 당신은 HAVING 절에 COUNT (*)를 사용하는 등, 결과 집합에이 열을 필요가 없습니다 - 따라서 선택된 열로 반환 할 필요가 없습니다. – Sean

+0

@MahmoudGamal 그는 HAVING 부분에 넣을 수 있으며 SELECT 부분에서 생략 할 수 있습니다. – Sean

+1

불필요한 중첩 수준을 제거하여 쿼리를 더욱 향상시킬 수 있습니다. 당신은 현재 :'X X IN (SELECT X FROM (SELECT X GROUPBY + HAVING))'을 가지고 있습니다. 당신은 단지 :'X X (그룹 X + 그룹 선택)' – Sean

1

:

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 
+0

흥미 롭습니다. 왜 세 컬럼 모두를 그룹화 했습니까? – windowskm

+1

@killianmcc 일반적으로 특정 열에 의해 결과가'GROUP BY' 될 때, 결과 집합에서 그룹에 속하지 않는 다른 열과 함께해야 할 것을 결정해야하며 두 가지 옵션이 있습니다 : use group by 절에 의해 그룹에 포함되거나 포함되지 않은 각 열에 대한 집계 함수. 'GROUP BY' 절에서 두 개의 열을 제거하고 SELECT 문에 그대로두면 오류가 발생합니다. 그 이유를 group by 절에 포함 시켰습니다. –

관련 문제