唐高祖武德四年,唐朝的军队包围了郑王王世充的洛阳,夏王窦建德带领全部人马来援助王世充。唐王军队的将领们请求避开窦建德的锋芒,不同他的军队交战。郭孝恪说:“王世充已处于绝境,很快将被反绑起来押送京师,窦建德又从远处赶下援助他,这是天意想让这两人灭亡吧。我们应当凭借武牢(即虎牢关)的险要地形,来抵御窦建德,寻找敌人的薄弱环节,发动进攻,这样做,必然能大败窦建德。”记室薛收说:“王世充的储库充实,统帅的又是江淮一带的精锐部队,只是因为缺少粮食,所以才被我们包围,窦建德亲自带兵从远方来,当然也把他的精锐部队都带来了。如果我们对他们放手不管,以至使这两股敌人联合起来,使窦建德能把所控制的河北地区的粮食转运来送给王世充,那么这场战争等于是刚刚拉开了帷幕,统一天下还是遥遥无期的事。现在应当分出一部分军队继续围守洛阳,而不要同王世充打仗,等待窦建德的军队从远方来,这样您就可以战胜他了。窦建德被打败之后,王世充一定会自己投降,超不过20天,郑王和夏王都将被活捉了。”李世民听从了这两人的意见,于是夏王窦建德被挡在武牢,不能前来救洛阳。
当夏王被迫停留在虎牢关时,夏王的太子祭酒凌敬曾对窦建德进言说:“大王您应当带领全部兵马渡黄河,攻占怀州、河阳、派人守在那里;另外整顿旗鼓,越过太行山,进入上党守在那里。进入上党地区,沿着汾水、晋水、直奔蒲津,您将如入无人之境,就可以为自己开拓地盘,招募军队,这样,关中地区将会因此而震惊恐惧,从而唐兵自然也就解除了对郑王的包围了。”窦建德的妻子曹氏也说:“祭酒的意见是对的。”凌敬提出的这些,只是《孙子兵法》早就提出过的策略,一个妇道人家尚且还懂得它是对的,然而窦建德却不能采纳,以致大败被杀,这是为什么呢?
暗探报告说:“夏王在等待时机,待到唐军秣草用完,必须到黄河以北来放牧战马时,他将要偷袭武牢”。李世民就北渡黄河,南到广武,察看敌方的形势,然后回来。临走时,他故意留下1000 多匹战马,在黄河边上放牧,来迷惑故人。窦建德果然出动全军出牛口,布下了连绵20多里的长阵,敲起战鼓向前进。将领们看到敌军人数如此众多,都十分害怕。李世民站到高处观望故阵后,对将领们说:“这股敌人在山东起兵后,还不曾遇到过强大的敌手。现在他们经过地形险要之处时吵吵闹闹,这是无纪律的表现,在逼近城池时才布阵,这是有看轻我方的念头。我方要是按兵不出,对方的勇气就会自己衰减。他们布阵久了,士兵们饥饿难忍,势必会自己退却,到那时再追击他们,就会战无不胜了。”窦建德布下了战阵,从辰时(上午七至九点)到午时(中午十一点至下午一点),士兵们又饿又困倦,都丧失了斗志,又争着抢水喝。这时,李世民命令宇文士及带领三百名骑兵,经过窦建德战地西边,飞驰南上。窦建德的战阵开始动摇,李世民说:“可以攻打他们了!”他亲自率领轻装的骑兵走在前边,大军随后跟上,一直逼近窦建德布下的战阵。战斗正在进行时,李世民又率领史大奈等人,卷起唐军的战旗,使敌人无法辨认他们的身份,然后冲入敌阵,一直冲到战阵的背后,才打开唐军的战旗,夏王的将士回来看到唐军的军旗时,惊惶失措,以为唐军在他们的背后又布下了伏兵,于是全军溃败。