ST. LOUIS -- David Freese found the perfect way to overcome a rough start.
The Cardinals ended a three-game losing streak and moved within 9½ games of first-place Milwaukee in the NL Central. Pittsburgh lost for the sixth time in nine games.
Freese blooped a bases-loaded hit down the right-field line with one out to put St. Louis in front to stay, 5-4. It was a bit of redemption for Freese, who committed a costly error in the third that led to three unearned runs. Then, in the bottom half, he grounded into an inning-ending double play that killed a potential rally.
"You play this game for six months and sometimes things are going to get tough on you," Freese said. "You play this game long enough, you don't sweat when things aren't going well."
Freese more than made up for the early mistakes later in the game.
"I'm a guy that definitely wants to perform," he said.
"He makes an error, he feels (bad). Hits into a double play, he feels worse," St. Louis manager Tony La Russa said. "Next time up there he clears his mind and puts a good swing on the ball. You've got to be a tough competitor to not dwell on the negative. That's why he's going to be a real good player for a long time here."
Holliday hit a three-run homer in the eighth off reliever Tony Watson. It was Holliday's 19th home run of the season. The veteran outfielder was not surprised that Freese was able to bounce back.
"I don't worry about him," Holliday said. "He's a good hitter. I'm never surprised when he gets a big hit."
St. Louis starter Edwin Jackson (10-9) allowed one earned run over six innings in his sixth start for the Cardinals. Jackson, acquired in a trade from Toronto on July 27, reached 10 wins for the fourth straight season.
Jackson improved to 3-2 with St. Louis. He has allowed three earned runs or fewer in five of his six starts as a member of the Cardinals.
"At the end of the night we got a win, and that's the mission," said Jackson, who was not pleased with his performance. "It was fortunate that I was able to come out with a little less damage."
St. Louis relievers Marc Rzepczynski, Jason Motte and Fernando Salas combined for three scoreless innings. Motte struck out Ronny Cedeno and got Ryan Doumit to fly out with a runner on third to end the eighth.
"He's the best guy we have coming into an inning with trouble," La Russa said.
The Pirates took a 4-3 lead in the fourth on back-to-back doubles by Cedeno and Michael McKenry.
St. Louis jumped to a 3-0 lead with two runs in the first and one in the second. Pujols and Berkman had RBI singles in the first. Skip Schumaker drove in Rafael Furcal with a two-out single in the second.
Pittsburgh scored three unearned runs in the third to tie the game. Garrett Jones' two-run single was the big blow. An error by Freese at third opened the gates for the two-out rally.
Morton gave up nine hits and five earned runs in 4 1/3 innings. He was 1-0 with a 0.95 ERA in his previous four starts.
"We didn't see what we normally see from Charlie," Pittsburgh manager Clint Hurdle said. "Balls were hit in the air for a high percentage of the night, which is not normal for him."
Morton said he felt good before the game.
"I think some of those were pretty good pitches," he said.
Jake Westbrook (10-7, 4.70 ERA) will face Pittsburgh right-hander James McDonald (8-6, 4.21) in the second game of the four-game series Friday. McDonald has won eight of his last 12 decisions. ... Pittsburgh RF Jose Tabata had a 10-game hitting streak snapped. ... On July 24, Pittsburgh, St. Louis and Milwaukee were tied for first in the NL Central. ... The Pirates play nine of their next 10 games on the road. ... Pittsburgh must go 21-11 the rest of the way to finish .500 or better for the first time in 19 years. ... Furcal batted eighth for the first time this season. ... Cardinals INF Ryan Theriot, mired in an 0-for-10 slump, had a sacrifice bunt in the eighth.