Quello che hai fatto prima (salvo gli erorri), dovrebbe essere corretto.
Lascia perdere IE per il momento: quello si sistema dopo quando la cosa funziona nei browser standard.

Comunque ecco quello che farei
codice:
HTML:
<table>
  <caption>titolo</caption>
  <thead>
    <tr>
      <th class="nobordi">codice</th>
      <th>diametro [mm]
diameter [mm]</th>
      <th>1 rocch. = mtl
1 roll = mtl</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <th>TOU200</th>
      <td>2,00</td>
      <td>850</td>
    </tr>
    </tr>
      <th>TOU200</th>
      <td>2,00</td>
      <td>850</td>
    </tr>
    </tr>
      <th>TOU200</th>
      <td>2,00</td>
      <td>850</td>
    </tr>
  </tbody>
</table>

CSS:
tbody td {
  border: 1px 0 0 1px solid black;
}
tbody th {
  border: 1px 0 0 0 solid black;
}
thead th {
  border: 0 0 0 1px solid black;
}
thead th .nobordi {
  border: 0;
}
Dimenticavo: userei XHTML 1.0 Strict, che e` la DTD in cui i CSS esprimono tutta la loro migliore potenza (le altre DTD lasciano qualcosa al browser)