单个 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
连接 JOIN
的 ON
条件中的两个表达式。关注内部查询:
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
我试着在 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
连接 JOIN
的 ON
条件中的两个表达式。关注内部查询:
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