620 年 7 月,唐稳定西北局势之后,即由李世民统帅大军进攻王世充,王世充自知不敌,向窦建德求救,为了维持夏政权在河北、山东的统治,为向西部作进一步发展,窦建德对李唐进攻王世充决不会坐视不救,在 621 年 3 月击败孟海公后,便亲率十万大军援助王世充。
唐遣李世民前去虎牢,据险御敌,阻止窦建德西进,然后伺机而战,将窦建德打垮。这计运用的结果,窦建德为虎牢之险所阻,不能西进,陷于进退维谷之境。5 月间,唐军伪装粮草完尽,引诱窦建德军前来决战,窦建德中计,全军出动,自板渚出牛口布阵,北距大河,西薄汜水,南达鹊山,长达二十里。李世民立于高处看窦建德的阵势,曾说窦军“风险而嚣,是无纪律,逼城而阵,有轻我心”,即不难看出唐军的动态。
李世民按兵不动,以逸待劳,用部分部队吸引住窦建德军全部。直到晌午,窦军“士兵饿倦,皆坐列,又争饮水”,阵势紊乱,李世民看到决战时机已到,即以轻骑渡汜水进攻窦军。此时窦建德与群臣正在聚合,仓促应战,阵势大乱。李世民率精锐插入窦军阵后,并改换唐旗帜,窦军更加混乱,甚至迅速溃散。唐军追杀三十里,俘获五万余人,窦建德也受伤被擒。