Seung Hwan Oh (4-2) pitched out of a jam in the ninth to get the win. Duke got his first save with the Cardinals by striking out pinch-hitter Manny Pina after Matt Bowman walked three batters.
The Cardinals' Jhonny Peralta led off the 10th with a single off Corey Knebel (0-2) and moved to third on Yadier Molina's ground-rule double. Jeremy Hazelbaker, who pinch ran for Peralta, scored the winning run on Grichuk's flare to right.
St. Louis' Adam Wainwright and Milwaukee's Wily Peralta dueled for seven innings, leaving a 1-1 game for the bullpens.