2016-12-10 4 views
-1

Ich habe versucht, eine Abfrage auf data.stackexchange.com, die mir die Antwort auf die Frage geben würde, was der Prozentsatz der Benutzer, die Beiträge geschrieben haben, die über 1000 angesehen wurden Zeiten und wer Abzeichen einer bestimmten Klasse besitzen.Single UND Bedingung gibt die gleiche Ausgabe wie WHERE Bedingung

Problem: Wenn ich AND ViewCount > 1000 schreiben bekomme ich das gleiche Ergebnis wie WHERE ViewCount > 1000 Ich verstehe nicht, warum es

Die Abfrage mit WHERE passiert:

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 

Die Abfrage mit 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 

Ausgabe (aus irgendeinem Grund ist es das gleiche in b oth Fälle):

Klasse 1 - 2 Prozent

2 Klasse - 15 Prozent

3 Klasse - 45 Prozent

+0

Könnten Sie Tabellendefinitionen zu Ihrer Frage hinzufügen? –

+0

Ich denke, es ist offensichtlich, weil Sie INNER JOIN verwenden, so wird es das gleiche Ergebnis sowohl in AND, WHERE-Bedingung zurückgeben, aber es kann sich in LINKEN VERBINDUNG anders verhalten und unterschiedliche Ergebnismenge zurückgeben. – Susang

+0

Könnten Sie bitte erläutern, welche Art von logischen Kollision Sie hier sehen? –

Antwort

1

Sie sind die AND mit den beiden Ausdrücke in dem ON Zustand verbinden die JOIN. Konzentrieren Sie sich auf der inneren Abfrage:

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

Versus:

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

Diese beiden Abfragen sind logisch äquivalent.

0

Bitte überprüfen Sie mit diesem aus, wenn Sie für den gleichen Fall verwirrend sind wie folgt: in 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 
Verwandte Themen