I have two related tables like this:
CREATE TABLE Vehicle (
Id INT NOT NULL PRIMARY KEY,
Name VARCHAR(255) NOT NULL
);
INSERT INTO Vehicle (Id, Name) VALUES (1, 'Car');
INSERT INTO Vehicle (Id, Name) VALUES (2, 'Van');
INSERT INTO Vehicle (Id, Name) VALUES (3, 'Motorcycle');
CREATE TABLE Signal (
Id INT NOT NULL PRIMARY KEY,
VehicleId INT NOT NULL,
Reading INT,
StartTime DATE
);
INSERT INTO Signal (Id, VehicleId, Reading, StartTime) VALUES (1, 1, 10, '2016-12-10');
INSERT INTO Signal (Id, VehicleId, Reading, StartTime) VALUES (2, 1, 15, '2017-01-10');
INSERT INTO Signal (Id, VehicleId, Reading, StartTime) VALUES (3, 1, 4, '2017-02-10');
INSERT INTO Signal (Id, VehicleId, Reading, StartTime) VALUES (4, 2, 4, '2017-03-10');
When I perform an OUTER JOIN like this, it behaves as expected:
SELECT v.Name, SUM(s.Reading)
FROM Signal s
RIGHT OUTER JOIN Vehicle v ON v.Id = s.VehicleId
GROUP BY v.Name
(actual and expected result):
Car | 29
Motorcycle | NULL
Van | 4
But when I add a WHERE condition like this, it no longer does what I expect:
SELECT v.Name, SUM(s.Reading)
FROM Signal s
RIGHT OUTER JOIN Vehicle v ON v.Id = s.VehicleId
WHERE StartTime > '2017-01-01'
GROUP BY v.Name
(actual result):
Car | 19
Van | 4
(expected result):
Car | 19
Motorcycle | NULL
Van | 4
Why do I not get the expected result when I add the WHERE condition, and how do I fix it?
wheretoandand it will work. The where clause is eliminating the nulls generated by the outer join, Basically your where clause is making your outer join behave like an inner join.