2012-03-08 29 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にラップすることです。

前記、それはすでにあなたのクエリのように思える同じCountryと異なるUserに属する異なるCountryUserレコードが存在することを確認するEXISTS句、のおかげで、そのuser_in_this_country > 1を保証します。私は何が欠けていますか?

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レベルで使用可能な列名です。 – JeffO

+0

@JeffO ORDER BY節の可用性が問題にどのように関係しているのかよく分かりませんか? –

関連する問題