The Cardinals won for the eighth time in 10 games by scoring eight runs in the fifth, sixth and seventh innings to take a 9-3 lead.
Jake Westbrook (6-4) allowed two runs on eight hits over 6 1/3 for the victory. He also had three of the 14 St. Louis hits and scored twice.
The loss went to Jason Marquis (9-5), who coughed up six runs on eight hits with three walks in 5 1/3. It was his third straight loss.
San Diego has dropped 15 of its last 17 games.
Wisconsin business offering 'therapeutic cuddling' forced to close
Costly malfunction causes beer flood at Boston-area brewery