"I misplayed a couple of balls but it was really impressive how Suppan picked me up," Duncan said. "I thought he did an unbelievable job and we ended up winning because of it."
Scott Rolen drove in a run and made a running, juggling catch for the Cardinals, who began the day leading the second-place Reds by less than one percentage point in the NL Central.
The Cardinals have won only two of their last six games, both times when prevailing Juan Mateo started for the Cubs. St. Louis won despite going 1-for-12 with runners in scoring position and stranding 15 runners.
"We couldn't come up with the hit that we needed," Cubs manager Dusty Baker said. "I thought one of them was going to haunt them sooner or later, but it didn't."
All-Star center fielder Jim Edmonds struck out four times in his first start for the Cardinals since leaving a game Aug. 15 because of post-concussion syndrome.
"He hadn't played in a while and his timing wasn't great," manager Tony La Russa said. "He was taking his swings and we only scored two, so it wasn't just Jimmy."
Duncan, who's provided a big boost for the offense with a .337 average, 14 homers and 29 RBI in 178 at-bats, was 1-for-4 with a double and scored the Cardinals' first run in the third.
His hitting was far overshadowed by the balls that eluded him in the first, fifth and sixth -- those were the only hits allowed by Suppan (10-7) to that point.
Duncan came in a few steps and then watched Freddie Bynum's fly ball sail over his head in the first, twice got turned around on Angel Pagan's fly ball to the warning track in the fifth, then hesitated and missed a diving attempt on Aramis Ramirez's liner in the sixth.
Suppan didn't allow of those runners, or anyone else, to advance past second base. Facing the Cubs for the second straight start, he gave up five hits, struck out two and walked three in 7 2/3 innings, plus added two hits and a sacrifice.
"I make a lot of mistakes out there, too, and they pick me up when they're making great plays," Suppan said. "There's a give and take there. He went after those balls hard and just didn't come up with them and fortunately I was able to make some pitches after that."
Randy Flores struck out Jacque Jones with runners on first and second for the last out in the eighth and Jason Isringhausen finished for his 31st save in 40 chances.
Isringhausen pitched for the first time since giving up a game-winning homer to the Mets' Carlos Beltran on Tuesday. Isringhausen drew a lot of boos from the home crowd when he came in to pitch.
Rolen made a nifty play behind Isringhausen, running far down the third-base line to catch John Mabry's foul pop. Avoiding a collision with shortstop Aaron Miles, Rolen had the ball pop off his chest at an attempt at a basket catch, then grabbed it with his bare hand.
"I overran it a little bit and had to try to smother it," Rolen said. "It kind of made me mad because it hurt my chest, so I just swiped at it. It happened pretty fast."
Duncan doubled off Mateo (1-2) to start the third and scored on Rolen's sacrifice fly, and two fielding plays involving Ramirez at third base helped the Cardinals take a 2-0 lead in the fifth.
Ramirez couldn't field Rolen's one-out chopper cleanly, losing sight of the ball just at his feet. Rolen stole second on Edmonds' strikeout and scored when Juan Encarnacion's low liner shot between Ramirez's legs on a play ruled a single.
Mateo gave up two runs, one earned, on 10 hits in five-plus innings.
- Actor Kevin Pollak, doing research for a screenplay based on the book "Three Nights in August" about La Russa, is in town the next few days along with author Buzz Bissinger.
- Chicago's Juan Pierre was 0-for-4 and didn't get the ball out of the infield, ending a 19-game road hitting streak during which he'd hit .364 (32-for-88).
- Ronnie Belliard and Gary Bennett each had three singles for St. Louis.
- The Cubs have been shut out 13 times.