"You'd think at some point fatigue would set in on a day like today with the heat," Holliday said. "Whether that's what happened or he just left the ball up, good pitchers still make mistakes."
The hit came in time to benefit Wainwright, who became the National League's second 10-game winner after making his seventh eight-inning start of the season. Wainwright showed no rustiness from a 10-day layoff prompted by some lingering tendonitis in his right elbow.
He nearly shut down a Philadelphia offense that had cruised to wins in the first two games of this series.
"Unbelievable," manager Mike Matheny said. "This guy has just been so good. Taking a little break and coming back as sharp as he is, I don't know why I'm surprised, but to be as sharp as he is with a little time off, he looked like the Adam we've watched all season."
The two clubs traded sacrifice flies early, setting up the eighth-inning dramatics. Hamels, his pitch count already at 109, returned to the mound with Phillies manager Ryne Sandberg prepared to give him 12-15 more pitches. Hamels opened the inning with his fifth walk of the game. Two batters later, Holliday split the outfield by drilling Hamels' 2-2 changeup. It was the last pitch Hamels would throw. Carpenter scored easily from first.
"A little bit up," said Phillies catcher Carlos Ruiz, speaking afterward for Hamels, who left without addressing the media.
The game-winning RBI was Holliday's 10th this season, tied with Atlanta's Evan Gattis for most in the NL.
"He's got a great changeup," Holliday said. "That's his bread and butter. When push comes to shove, that's his best pitch."
Despite not getting another hit, the Cardinals added to that advantage by scoring twice more when Jake Diekman relieved Hamels. Holliday was ruled safe on a bang-bang play at the plate when Ruiz dropped the feed from his shortstop. Matt Adams tacked on the final run with his second sacrifice fly of the game. His first was in the second and snapped Hamels' 24-inning scoreless streak.
Closer Trevor Rosenthal entered in the ninth to lock down the win and his 21st save. With the victory, the Cardinals became the fourth NL team to reach the 40-win mark this season.
"When we bring Adam and put him on the mound and you know you're facing Hamels, who has been throwing very well, you know it's just going to be one of those days -- long fights, grinding it out, stay the course," Matheny said. "When you see a pitcher laying it out there like [Wainwright] does every single chance he gets, he's going to stay there and give us a chance."
A quarter of those team victories belong to Wainwright, who looked every bit healthy in his return. He lowered his ERA to 2.08 by allowing the Phillies to score only on a third-inning sacrifice fly. Wainwright did not walk a batter and struck out seven.
His command wasn't pinpoint to start the game, likely attributed to the extra rest he had between starts. But it got there. Wainwright backed off on throwing so many two-seamers and instead kept the Phillies guessing by varying speeds of his cutter. He changed his delivery up batter to batter, too, in an effort to remain unpredictable.
The only time he felt anything abnormal with his elbow was on a swing in his first at-bat. His next time up at the plate, he doubled.
"It felt like a normal arm," Wainwright said. "The game in Tampa Bay [on June 10], even though I had decent results, that didn't feel good at all. It hurt. We got all that calmed down. … I don't know how many days I missed, nine or 10 days there. It felt like an eternity. It was the right move. It was the smart play and I'll be ready for the rest of the season."
Hamels, who knocked a one-out double in the fifth, would be the last runner to reach second against Wainwright. Wainwright later closed his 104-pitch start by freezing Ryan Howard with two out and the potential tying run on base in the eighth.
"We needed to win a game," Wainwright said. "We faced a tough pitcher. That's why you stick around as long as you can in those games, to give your offense enough chances to score some runs."