PITTSBURGH -- With each late inning, Pittsburgh put the potential winning run in scoring position.
In the ninth, 10th and 11th, a Philadelphia reliever walked a Pirates batter, only to strand him at second or third when Pittsburgh couldn't come up with a clutch hit.
Jose Tabata almost legged out a weak grounder to third with two outs and a man on third in the 10th. He didn't waste his second such opportunity two innings later.
Tabata hit a game-ending single with two outs in the 12th inning, lifting the Pirates to a 2-1 win over the Phillies in a game without an extra-base hit.
"I think in the moment, you want to win the game so you put a little pressure on yourself," Tabata said.
"You saw me before with somebody on third base and [not come through]," he added. "But the next time, it's a new time, and said to myself, 'OK, this is my moment. Come on."'
Tabata smacked a sinking liner off of Danys Baez (1-3) toward the hole on the right side that a lunging second baseman Chase Utley got a glove on but could not handle. Right fielder Ben Francisco's throw was not in time, giving Tabata his second RBI of the game when Xavier Paul scored from second. Paul had singled with two outs and stole a base.
Pittsburgh won for the third time in four games, beating the four-time reigning National League East champions who have the best record in the NL for the fourth time in five games at PNC Park, dating to last season.
"When you play teams like that, you want to go out there and prove a point," Paul said. "Make a statement that we can play with these guys. We're on a little roll here."
The Phillies lost their third consecutive game for only the second time this season, despite starter Cole Hamels allowing only one hit in eight innings.
Hamels and Jeff Karstens had dueling one-hitters going through five innings. Karstens was charged with four hits in seven innings.
Daniel Moskos (1-0) earned his first major-league win for Pittsburgh.
Moskos worked a perfect top of the 12th -- surviving a Carlos Ruiz fly to the warning track in right-center.
"We didn't hit," Phillies manager Charlie Manuel said. "We need to score some runs. Hamels pitched very good. The bullpen was good. We went five innings where we didn't square a ball up. We went 15 outs and didn't hit a ball on the nose."
The crowd of 33,861 was the Pirates' third-largest of the season -- heavily aided by several thousand Phillies fans who had made the cross-state drive.
The ones who did got to see Philadelphia's full everyday lineup for the first time this season. Shane Victorino was activated from the disabled list Friday.
But having all their regulars available did little to help an offense that ranks a pedestrian 18th in the majors in runs.
"I think this lineup is going to hit," Manuel said. "It has to hit. I've got confidence in those guys hitting. I've seen those guys hit for four or five years, some of those guys for six or seven years."
Jimmy Rollins led off the game with an infield single, but Karstens retired 15 of the next 16 he faced.
After Karstens hit Ryan Howard with a pitch later in the first, the Phillies didn't have another baserunner until the sixth. They had two on and none out with the heart of their order coming up, prompting the sea of red in the stands to start chanting "Let's go Phillies!"
Placido Polanco lined into a double play, but Rollins stole second, and Utley drove him in when he softly lined a single that found its way through the right side of the infield.
The Pirates tied the game at 1 in the bottom of the inning without a hit.
Cedeno led off with a walk and was sacrificed to second by Karstens. A wild pitch got him to third and he scored when Tabata flew out to deep right.
Karstens, who had two strikeouts and did not walk a batter, continued a recent stretch of good Pirates starting pitching. Paul Maholm allowed six earned runs in Pittsburgh's previous game Thursday, snapping a streak of 13 games in which starters allowed two earned runs or less.
"We know what their starting staff is like, and we know what our job is: Try to go out there and keep pace with Cole and give our team a chance to win," Karstens said. "It took a little longer than we wanted but we eventually got the big hit in the 12th.
"It was a fun game," he said.
Hamels pitched well enough to win what would have been his fourth consecutive start for the third time in his career and tie Pittsburgh's Kevin Correia for the majors' lead in victories with eight. He has allowed only 20 earned runs over his past 11 starts.
"He was really sharp, Hamels," Pirates manager Clint Hurdle said. "There wasn't a lot of hittable balls for us."
- The walkoff hit was Tabata's second of the season, the other coming April 8 against Colorado.
- Victorino, out since May 18 with a strained right hamstring, went 0 for 5.
- The Pirates are 21-12 against the Phillies at 10-year-old PNC Park.
- Philadelphia has lost nine of its past 14 road games.
- The only other time Philadelphia lost as many as three in a row was a four-game skid May 14-17.