Even though the Cardinals jumped on Houston starter Bud Norris -- who has had tremendous success against St. Louis in his career -- with three runs in the first inning, the win was somewhat unlikely when you consider Astros pitchers struck out a season-high 15 batters and sent down the final 20 batters they faced.
Houston also outhit St. Louis, 12-7, despite not getting a hit against Cardinals starter Adam Wainwright until the fifth inning.
"The guys really put some things together, but we left a lot of runners on," said manager Brad Mills, whose team tied a season high by stranding 13 runners on base. "We had our opportunities."
No opportunity was bigger than the eighth inning.
With the Astros trailing 4-3, Castro began the inning with a single, which was his career-high-tying third hit of the game. Marwin Gonzalez followed with a bunt toward first that was fielded by Adams, who threw high and watched the ball glance off the glove of Descalso, who was covering the bag.
As the ball rolled into foul territory, Castro was sent home by third-base coach Dave Clark and was thrown out by Descalso. Even more impressive than the throw was how quickly Descalso chased down the ball, sliding into foul territory to pick it up before coming up throwing.
"I just tried to scramble to get to it as fast as I could," he said. "I honestly didn't think they were going to send him with no outs. But I looked up and he was rounding third, so I just fired it home and put it right on the money. And he was out."
Castro tried to clip the back part of the plate.
"It was close," he said. "In the moment, it's hard to tell. I knew it was close, I thought I might have been able to swipe part of the plate. Descalso made a great throw and Yadier came down and put the tag on. It was close. It was one of those ones that for me, in the play, was hard to tell. It just happened to not go our way."
Fernando Martinez (0-for-5) struck out for the third time to end the eighth, and Jason Motte pitched around a leadoff single in the ninth for his 10th save.
"That's the thing is, we had so many chances and we couldn't capitalize enough," Astros shortstop Jed Lowrie said. "We left too many guys on base to win a game like that. It's tough when you lose by one when you leave that many guys on."
Norris (5-3) struck out Rafael Furcal to start the game before giving up five consecutive hits, including a homer to Descalso, an RBI single by Allen Craig and an RBI double by David Freese to make it 3-0. Craig's seventh homer of the season pushed the lead to 4-0 in the third, but that was the Cardinals' last hit of the night.
Norris struck out 12 to become the first Astros pitcher to strike out at least 12 and not issue a walk since Shane Reynolds on Aug. 15, 1999.
"They're a tough team," Norris said. "There's no way around it. They've got a really good ballclub and I've got to go out there and make pitches and they attacked me early. A couple of first-pitch aggressive swings, and some balls fell in. It was tough. I got back in my groove and tried to work from there."
Houston finally broke through in the sixth inning. Chris Johnson tripled and scored on a Brett Wallace single, and Wallace scored on a pinch-hit single by Brian Bogusevic. Jose Altuve's single scored Castro to slice the Cardinals' lead to one, 4-3.
Wainwright (5-6) improved to 11-1 with a 1.73 ERA in 19 career games and 13 starts against the Astros. He has allowed only four earned runs in his last 35 2/3 innings against Houston.
"They have a good pitching staff," Lowrie said. "Wainwright threw a great game and we battled them the whole time and got some opportunities, but we didn't get that one last hit to finish it off. We keep battling and gave ourselves a chance. That's all you can ask for."