2012-03-08 4 views
1

정말 잘 작동하는 쿼리가 있습니다. 그러나 users_in_this_country이 1보다 큰 경우 필터를 추가하려고합니다. users_in_this_country > 1을 WHERE에 추가하는 것을 알고 있습니다. 그러나 괄호 안에 추가하면 유효하지 않은 열이라고 말하면서 괄호 바깥에 추가하면 같은 것입니다. 이것은 아마도 멍청하고 쉽게,하지만 내가 뭘보고 지나치는거야? 감사! 당신이 그것을 참조 할 수 없습니다이COUNT 기준으로 필터링

WITH CTE AS (
     SELECT u.ContactName 
      ,cu.[User ID] 
      ,c.Name 
      ,c.ID 
      ,cu.[Foreign Table] 
      ,count(*) OVER (PARTITION BY c.ID) AS user_in_this_country 
     FROM dbo.Country AS c 
     INNER JOIN dbo.CountryUser AS cu ON c.ID = cu.[Foreign ID] 
     INNER JOIN dbo.UserColder AS u ON cu.[User ID] = u.ID 
     WHERE EXISTS (
      SELECT * 
      FROM CountryUser AS cu2 
      WHERE cu2.[Foreign ID] = cu.[Foreign ID] 
      AND cu2.[User ID] <> cu.[User ID] 
      AND cu.[Foreign Table] = 'Country') 
) 
SELECT * 
FROM CTE 
WHERE user_in_this_country > 1 
+0

'user_in_this_country' (단일 사용자) 오타라고 말해하고 있음을하십시오 사용자 ** s **를 타자는 것을 의미했다 !! 그렇지 않으면 정말 바보 같고 쉽게 :-) – paxdiablo

답변

2

WHERE 절은 주어진 행에 대한 의미가 다른 행이 WHERE 절을 만족시키는 지에 달려 있다는 것입니다. 그래서 그것은 모두 너무 원형이 될 것입니다.

가장 간단한 해결 방법은 전체 검색어를 SELECT * FROM (...) t WHERE t.user_in_this_country > 1에 포함하는 것입니다. 말했다

, 이미이 보장 쿼리처럼 보인다 user_in_this_country > 1 그 같은 Country하고 다른 User에 속하는 다른 CountryUser 기록이 존재 함을 확인하게 EXISTS 조항의 미덕. 내가 뭘 놓치고 있니?

2

이유와 같은 당신이 CTE 또는 하위 쿼리를 사용할 필요가 OVER 절과 연동 해에 사용 (COUNT 등) 집계 함수와

SELECT u.ContactName 
     ,cu.[User ID] 
     ,c.Name 
     ,c.ID 
     ,cu.[Foreign Table] 
     ,count(*) OVER (PARTITION BY c.ID) AS user_in_this_country 
FROM dbo.Country AS c 
INNER JOIN dbo.CountryUser AS cu ON c.ID = cu.[Foreign ID] 
INNER JOIN dbo.UserColder AS u ON cu.[User ID] = u.ID 
WHERE EXISTS (
    SELECT * 
    FROM CountryUser AS cu2 
    WHERE cu2.[Foreign ID] = cu.[Foreign ID] 
    AND cu2.[User ID] <> cu.[User ID] 
    AND cu.[Foreign Table] = 'Country') 
+0

아, 예, EXISTS가 동일한 [외국인 ID] 권한을 가진 다른 사용자가 있는지 확인하고 있습니까? 내가 생각하기에 user_in_this_country> 1을 의미해야한다고 가정합니다. – Umair

0

"users_in_this_country"는 열이 아니기 때문에 WHERE 절의 범위에서 유효하지 않은 별칭입니다. 나는 ' "OVER"또는 PARTITION BY에 익숙하지 않은 해요하지만, 내 생각 엔 당신이 이런 식으로 뭔가를해야 할 것입니다 :

WHERE blabla AND (count(*) OVER (PARTITION BY c.ID)) > 1 
+0

"users_in_this_country"는 WHERE 절 수준에서 유효한 열 이름이 아닙니다. ORDER BY 수준의 availalbe 열 이름입니다. – JeffO

+0

@JeffO ORDER BY 절의 가용성이 문제와 관련이 있는지 확실하지 않습니까? –

관련 문제