2016-12-10 10 views
-1

data.stackexchange.comでクエリを作成しようとしましたが、1000を超えて表示された投稿を投稿したユーザーの割合あるクラスのバッジを持っている人。単一AND条件でWHERE条件と同じ出力が得られます

問題は:

SELECT 
TOP 1000 
Class, (Count(Badges.UserId)* 100/(SELECT COUNT(*) From Badges)) AS Percentage 
FROM Badges 
WHERE Badges.UserId IN (SELECT Posts.OwnerUserId FROM Posts 
INNER JOIN 
Badges ON Posts.OwnerUserId = Badges.UserId 
WHERE ViewCount > 1000) 
GROUP BY Class 
ORDER BY Class 

クエリでAND::私はAND ViewCount > 1000を書く場合、私はそれが

WHEREでクエリをなぜ起こるか私は理解していないWHERE ViewCount > 1000 と同じ結果を得る

SELECT 
TOP 1000 
Class, (Count(Badges.UserId)* 100/(SELECT COUNT(*) From Badges)) AS Percentage 
FROM Badges 
WHERE Badges.UserId IN (SELECT Posts.OwnerUserId FROM Posts 
INNER JOIN 
Badges ON Posts.OwnerUserId = Badges.UserId 
AND ViewCount > 1000) 
GROUP BY Class 
ORDER BY Class 

出力(何らかの理由でb OTHの場合):

1クラス - 2パーセント

2級 - 15%

3クラス - あなたのON状態で2つの式を接続するANDを使用して45%

+0

あなたは、あなたの質問にテーブル定義を追加してもらえますか? –

+0

INNER JOINを使用しているので明らかですが、AND、WHERE条件の両方で同じ結果を返しますが、LEFT JOINでは異なる動作をして別の結果セットを返すことができます。 – Susang

+0

あなたはここでどのような論理的衝突が起こっているかを詳しく教えてください。 –

答えて

1

JOIN。内側のクエリに焦点を当てる:対

SELECT Posts.OwnerUserId FROM Posts 
INNER JOIN Badges ON Posts.OwnerUserId = Badges.UserId 
WHERE ViewCount > 1000 

SELECT Posts.OwnerUserId FROM Posts 
INNER JOIN Badges 
ON (
    Posts.OwnerUserId = Badges.UserId 
    AND ViewCount > 1000 
) 

これらの2つのクエリは論理的に等価です。

0

あなたは以下のように同じケースのために混乱している場合、これにチェックしてください:SQL Serverで

CREATE TABLE #a(catId INT, catName VARCHAR(50)) 
CREATE TABLE #b(productId INT, catId INT) 

INSERT INTO #a VALUES 
(1, 'Test1'), 
(2, 'Test2'), 
(3, 'Test3'), 
(4, 'Test4') 

INSERT INTO #b VALUES 
(5, 1), 
(6, 2), 
(7, 3), 
(8, 1) 

--Return data what exists in both tables 
SELECT a.*, b.productId 
FROM #a a 
INNER JOIN #b b ON b.catId = a.catId 
AND b.catId < 3 

--Same as above 
SELECT a.*, b.productId 
FROM #a a 
INNER JOIN #b b ON b.catId = a.catId 
WHERE b.catId < 3 

--Same as above 
SELECT a.*, b.productId 
FROM #a a 
LEFT JOIN #b b ON b.catId = a.catId 
WHERE b.catId < 3 

--Return all exists in first table though not exist in second table 
SELECT a.*, b.productId 
FROM #a a 
LEFT JOIN #b b ON b.catId = a.catId 
AND b.catId < 3 
関連する問題