Asdrúbal había estado a la defensiva desde la derrota de su flota en la batalla del Río Ebro en la primavera de 217 a. C. Había dejado a un comandante subordinado llamado Boaster con una fuerza militar para vigilar el Ebro ante la posibilidad de que los romanos intentaran cruzarlo. Boaster se había retirado una vez que los romanos lograron cruzar el río, e incluso fue engañado por un jefe hispano llamado Abelox para que entregase a los romanos los rehenes de tribus hispanas que mantenía en Sagunto. Esto provocó revueltas en la Hispania controlada por Cartago, especialmente en la tribu de los turdetanos cerca de Gades (hoy Cádiz) en 216 a. C. Asdrúbal recibió refuerzos consistentes en 4.000 hombres de infantería y 500 de caballería, junto con instrucciones de marchar a Italia una vez que hubiese asegurado el territorio hispano. Pasó gran parte del año volviendo a someter a las tribus hispanas rebeldes, con poco tiempo para enfrentarse a los romanos.
Cneo Escipión, tras la batalla del río Ebro, había recibido 8.000 hombres de refuerzo bajo el mando de su hermano Publio. Los dos hermanos tenían rango proconsular y ejercían el mando conjunto del ejército. Adoptaron una estrategia naval agresiva ante la destrucción de la flota cartaginesa el año anterior, dedicándose a saquear las posesiones de los Barca en Hispania y en las Islas Baleares. Los hermanos Escipión también reclutaron tropas auxiliares de las tribus hispanas, colocaron guarniciones en las ciudades para expandir su esfera de operaciones y consolidaron su control del norte del Ebro haciendo frente a los descontentos que pudiera haber entre las tribus. También fomentaron que las tribus hispanas aliadas realizasen incursiones de saqueo contra las tribus aliadas de Cartago al sur del Ebro.
A comienzos del año 215 a. C. los romanos habían cruzado el río Ebro y habían comenzado el asedio de una pequeña ciudad aliada de Cartago llamada Ibera. Asdrúbal, dejando a Himilcón al mando en Cartagena, marchó al norte con su ejército de tierra y llegó al Ebro. Sin embargo, no cruzó el río para saquear las posesiones romanas al otro lado ni tampoco acudió en ayuda de la ciudad de Ibera, sino que optó por asediar una ciudad aliada con los romanos llamada Dertosa.
Los Escipiones levantaron el asedio y se dirigieron a enfrentarse con los cartagineses de Asdrúbal. Con ello, el general cartaginés logró la iniciativa estratégica, y habían ayudado a sus aliados provocando el levantamiento del sitio romano a la vez que elegían el lugar en el que iba a tener lugar la batalla.
Los ejércitos acamparon en una planicie ubicada entre Ibera y Dertosa y, tras unos 5 días de hostigamiento entre los dos ejércitos, los generales desplegaron sus tropas para la batalla.
La infantería romana estaba compuesta de dos legiones romanas de unos 10.000 soldados, más otros 18.000 combatientes itálicos aliados. La caballería estaba compuesta de 600 soldados romanos y 1.800 itálicos. Los romanos, además, contaban con un contingente de tropas hispanas compuesto por 2.000 hombres de infantería y 400 de caballería pesada.
Asdrúbal tenía 15.000 lanceros libios, 1.000 mercenarios (en su mayoría ligures procedentes de Italia) y 8.000 soldados hispanos de infantería. En cuanto a la caballería, estaba compuesta de 450 soldados libios y púnicos, 1.200 soldados de caballería pesada hispanos y 2.300 soldados de caballería ligera númida. Su ejército también contaba con 20 elefantes de guerra y 1.000 honderos baleares.
La Batalla
Los romanos realizaron el despliegue de sus tropas siguiendo el esquema tradicional de la legión manipular, con la caballería en las alas y la infantería en el centro. La caballería romana y la hispana fue desplegada en el ala derecha, mientras que la caballería aliada itálica quedó ubicada en la izquierda. Dentro de la línea de infantería, las tropas itálicas estaban colocadas en los laterales, al lado de la caballería, y las legiones romanas se ubicaron en el centro de la línea. Unos 2.000 soldados romanos e italianos, junto con el contingente formado por los hispanos, fue reservado y quedó en protección del campamento.
Asdrúbal emplazó a la infantería ligera, hostigadores y levas iberas en el centro, con la infantería pesada a ambos flancos. En el exterior se dispuso la caballería, iberos y númidas en su mayoría, más numerosa que la romana. Por último, situó a sus elefantes de guerra al frente de la caballería, 10 en cada flanco, al igual que Aníbal hiciera en el Trebia.
Al lado de la caballería cartaginesa Asdrúbal colocó una falange de infantería libia y, en el centro y flanqueada por las falanges, se encontraba una línea de infantería hispana algo más delgada de lo habitual. Por último, los honderos baleares formaron una línea de hostigadores delante de la infantería. En reserva quedaron entre 2.000 y 3.000 hombres más.
El despliegue inicial, por tanto, recordaba mucho el de la batalla de Cannas, puesto que la intención de Asdrúbal era imitar la táctica de su hermano en Cannas, embolsando al poderoso centro del ejército romano mientras destrozaba los flancos con sus mejores tropas.
Tras un breve enfrentamiento entre las tropas ligeras, las legiones romanas ubicadas en el centro de la formación cargaron contra la delgada línea de infantería hispana que tenían en frente. Al tener la ventaja tanto numérica (unos 10.000 hombres frente a 8.000) como en profundidad de la formación, los romanos lograron hacer retroceder a los hispanos de forma casi instantánea. Sin embargo, esto era parte de la táctica de envolvimiento doble que Asdrúbal estaba intentando poner en práctica.
Los elefantes cartagineses ubicados en las alas cargaron contra la caballería romana e itálica. Sin embargo, su carga no tuvo éxito. La caballería romana logró mantener la formación y los elefantes no tuvieron mayor papel durante la batalla. Por su parte, la formación de los itálicos tomó contacto con los libios que se encontraban en el frente opuesto, buscando con ello apoyar al centro romano.
Los libios y los mercenarios ubicados en los flancos cargaron contra la infantería itálica y, a pesar de su superioridad numérica (16.000 frente a 18.000), los itálicos comenzaron a retroceder. Sin embargo, y al contrario de lo que sucedió en Cannas, los libios no lograron flanquear a los romanos. Las caballerías, por su parte, seguían enfrentándose las unas a las otras sin que hubiese un vencedor claro. A pesar de tener ventaja numérica, la caballería cartaginesa no lograba dejar fuera de combate a los romanos y expulsarles del campo de batalla.
En mitad de esta situación de indecisión en la que las dos alas del ejército se enfrentaban al lado opuesto sin conseguir ganar la suficiente ventaja, las levas hispanas del centro no soportaron la presión y rompieron filas, huyendo del campo de batalla.
En la batalla del Trebia el centro de la infantería cartaginesa también había colapsado bajo el empuje de la infantería pesada romana. Sin embargo, Aníbal había logrado ganar la batalla gracias a que su infantería había flanqueado a los romanos por ambos lados y su caballería, tras hacer huir a sus oponentes, había atacado a la infantería romana desde la retaguardia junto con las tropas emboscadas de Magón. Asdrúbal, sin embargo, no tuvo la misma suerte. No tenía tropas emboscadas en Dertosa, y sólo contaba con que los libios habían logrado hacer retroceder a los itálicos antes de que el centro de la formación se colapsase.
La caballería cartaginesa, al ver cómo la formación de la infantería se venía abajo, dejó de luchar contra los romanos y abandonó el campo de batalla. La infantería romana, por su parte, una vez libre de sus oponentes hispanos acudió en ayuda de los itálicos.
Tras una sangrienta lucha en la que la infantería libia mantuvo una dura resistencia contra su enemigo, infligiendo y recibiendo duras bajas, el resto del ejército de Asdrúbal se batió en retirada.
Asdrúbal sobrevivió a la batalla junto con la mayoría de sus elefantes y de su caballería, pero con muy poca infantería, la mayor parte de la cual estaba compuesta por el contingente hispano. La persecución romana no fue lo suficientemente rápida como para repetir el éxito de la batalla de Cissa.
Los romanos consiguieron apoderarse del campamento cartaginés poco después de que Asdrúbal consiguiese evacuar a toda velocidad a sus soldados. Las provisiones y el botín del campamento cayó en manos de los romanos, mientras que los cartagineses se retiraron a Cartagena, dejando a los romanos firmemente asentados en el sur del Ebro.
Asdrúbal recibiría el refuerzo de otros dos ejércitos al mando de Magón Barca y de Asdrúbal Giscón, con la finalidad de evitar que los romanos tomasen el control de las posesiones cartaginesas en Hispania. Cartago no volvería a montar ninguna campaña efectiva más allá del Ebro, y lucharía contra los romanos en el territorio con suerte desigual hasta el año 205 a. C.
Por su parte, los hermanos Escipión no prepararon una persecución inmediata de los cartagineses. Por el contrario, prefirieron mantener su estrategia de saqueos, instigando a las tribus hispanas a rebelarse mientras que creaban una sólida base de poder. No recibirían más refuerzos desde Italia hasta el final de su mandato en Hispania y se enfrentarían a los hermanos Barca y a Giscón con resultados variables hasta 212 a. C., año en que lanzarían una gran campaña que finalizaría con la batalla del Betis Superior.