Andrew Mangiapane had a goal and two assists for Calgary (20-15-5), which passed Edmonton in the Pacific Division standings. David Rittich made 28 saves.
"It's big, a four-point swing for us tonight, and we knew that going in," Mangiapane said. "It was good that we got the two points. Those two points are huge for us."
WATCH: [All Flames vs. Oilers highlights]
Edmonton (20-17-4) dropped out of the top three in the Pacific for the first time this season and has lost four of its past five games.
"They were better right off the hop, in the first 10 seconds, we just got beat," Oilers captain Connor McDavid said. "There is no real excuse for that. We've always talked about coming off breaks and how this team has struggled coming off a break and tonight was no different."
Mikko Koskinen gave up four goals on 24 shots and was replaced by Mike Smith after Calgary's fourth goal at 16:54 of the second period. Smith made six saves.
"We wanted to come here and play like we have on the road the past little bit and come out of here with a greasy win," Flames forward Matthew Tkachuk said. "I thought we did a good job of that. I think the month of December, and the first half of the season, we played a lot of Eastern Conference teams. Now we're starting to get into a stretch where we're playing a lot of divisional games and teams that are right there in the standings with us in the West. I wouldn't say it was a statement game, we just wanted to come here and play good, score some goals, play good team defense and come out with two points."