"It was a tough night to score runs," Phillies manager Charlie Manuel said.
On his own bobblehead figurine giveaway night, Halladay was a tough-luck loser for just the second time this season. He did not go down easily.
Halladay threw 132 pitches -- one shy of his career high -- and the most by any pitcher in the Major Leagues this season. He allowed nine hits, two runs, one walk and struck out six in his fourth complete-game performance of the year.
"There's going to be close games," Halladay said. "You can't really worry about how many runs you're going to score. There's a lot of things I need to correct before I'm going to start complaining about how many runs we score."
On this cold and breezy night, runs were hard to come by -- even for the team leading the National League in runs and average. The Phillies pounded out 14 hits a day before; there was no such activity on Tuesday.
Phils second baseman Chase Utley sat out for the second successive game with an illness, forcing Jimmy Rollins into the No. 3 slot in the order again. Rollins went 0-for-4 in his second game back from the disabled list.
And the Phillies had their opportunities to put runs across, like with the bases loaded and two outs in the sixth. Duke got Ben Francisco to ground out to third base on his final pitch of the night to escape the jam.
Duke earned his first win since April 10, allowing just one run on six hits in six innings.
"Zach pitched well, their bullpen pitched well, that's what it's about," Phillies outfielder Shane Victorino said. "He kept our hitters off balance, and we never really had any kind of momentum."
Phillies outfielder Jayson Werth was also thrown out at home plate trying to score on a single to center field by Juan Castro in the fifth -- a play that ended up being crucial to the game's outcome.
Pittsburgh went ahead 1-0 on back-to-back doubles in the second inning, and then Garrett Jones drove in the go-ahead run with an RBI single in the sixth. Jones went 3-for-4.
"You just never know when that extra run is going to cost you," Halladay said.
That Halladay will pitch nine innings is becoming a foregone conclusion for Philadelphia. He has four complete games in eight starts this season.
With two outs and the bases loaded in the ninth, and Halladay sitting at 126 pitches, Manuel walked out to the mound, presumably to take Halladay out. But as he's done once already before this season, Manuel decided to leave his ace right-hander in. Halladay struck out Delwyn Young with a 3-2 curveball six pitches later.
"When he gets over 120 pitches, I get concerned about him," Manuel said. "I know he's in really good shape. I wanted to see where he was at. I think he's pretty honest with me. He definitely wanted to go get the hitter, I knew that."
It might've been a momentum builder for the Phillies, but there just wasn't anything to get things rolling. Pirates closer Octavio Dotel finished off the game with a 1-2-3 ninth. Philadelphia went down as quietly as it had the eight innings before.
"We hit balls on the ground pretty sharp but right at people," Manuel said.
The loss drops Philadelphia's record to 12-4 in May, and it was the first time since May 8 the team failed to score more than three runs.
First baseman Ryan Howard went 3-for-4 with three singles and a run scored, and he now leads the Major Leagues with 18 multihit games. But he couldn't propel the Phillies to a win for their ace on his own.
"Halladay is just a gamer," Victorino said. "It was just unfortunate we didn't score runs."