单个 AND 条件给出与 WHERE 条件相同的输出

Single AND condition gives the same output as WHERE condition

我试着在 data.stackexchange.com 上写了一个查询,它会给我这个问题的答案:发表的帖子被查看超过 1000 的用户的百分比是多少时间和谁拥有某个 class 的徽章。

问题:如果我写 AND ViewCount > 1000 我会得到与 WHERE ViewCount > 1000 相同的结果 我不明白为什么会这样

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 的查询:

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

输出(由于某种原因在两种情况下是相同的):

1 class - 2%

2 class - 15%

3 class - 45%

您正在使用 AND 连接 JOINON 条件中的两个表达式。关注内部查询:

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
)

这两个查询在逻辑上是等价的。

如果您对以下相同情况感到困惑,请查看此内容: 在SQL服务器

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