2016-12-10 55 views
-1

我試圖撰寫一個關於的查詢data.stackexchange.com這會給我這個問題的答案是什麼百分比的用戶誰寫了超過1000時間和誰擁有某一類的徽章。單個條件給出與WHERE條件相同的輸出

問題:如果我寫AND ViewCount > 1000我得到了相同的結果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 
WHERE ViewCount > 1000) 
GROUP BY Class 
ORDER BY Class 

查詢與AND:

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類 - 45%

+0

您可以加入表定義你的問題? –

+0

我認爲,這是一個顯而易見的,因爲你正在使用INNER JOIN,所以它將在AND,WHERE條件下返回相同的結果,但它在LEFT JOIN中的行爲可能不同,並返回不同的結果集。 – Susang

+0

請您詳細說明您在這裏看到什麼樣的邏輯碰撞? –

回答

1

您正在使用AND到兩個表達式連接在的ON條件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 
) 

這兩個查詢是邏輯上等同。

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