楼主可以参考一下方法,该方法有时候会重复,有时间我再优化优化(借用Yang_(扬帆破浪) ( ) 大哥的建表数据): --音乐分类表 SET NOCOUNT ON createtable music_category(id intidentity(1,1),musicid int,songcategoryid int) --计划播放类别表 createtable plans(id intidentity(1,1),songcategoryid int) insert music_category(musicid,songcategoryid) select1,1 unionallselect2,1 unionallselect3,1 unionallselect4,1 unionallselect5,1 unionallselect6,1 unionallselect7,2 unionallselect8,2 unionallselect9,2 unionallselect10,2 unionallselect11,3 unionallselect12,3 unionallselect13,4 unionallselect14,4 unionallselect15,5 unionallselect16,5 unionallselect17,5 unionallselect18,5 unionallselect19,6 unionallselect20,7 unionallselect21,8 unionallselect22,8 unionallselect23,8 insert plans(songcategoryid) select1 unionallselect1 unionallselect3 unionallselect1 unionallselect5 unionallselect6 unionallselect4 unionallselect2 unionallselect1 unionallselect4 unionallselect2 unionallselect2 unionallselect7 unionallselect4 unionallselect7 unionallselect2 unionallselect5 unionallselect5 DECLARE@EXECUTE_SQLnvarchar(4000) --构造结果表 SELECT*,CAST(NULLasint) musicid INTO #T FROM plans SELECTMIN([ID]) AS[ID]INTO #ID FROM #T WHERE musicid ISNULLGROUPBY songcategoryid WHILEEXISTS(SELECT1FROM #ID) BEGIN --分组统计,根据各组随机得到音乐UPDATE到结果表#T中 UPDATE A SET A.musicid=B.musicid FROM #T AS A INNERJOIN (SELECT songcategoryid,MIN(musicid) AS musicid FROM music_category AS A1 WHERE A1.musicid in(SELECTtop1 B1.musicid FROM music_category AS B1 WHERE B1.songcategoryid=A1.songcategoryid ANDNOTEXISTS(SELECT1FROM #T AS C1 WHERE C1.musicid=B1.musicid) ORDERBYNEWID() DESC) ANDNOTEXISTS(SELECT1FROM #T AS B1 WHERE B1.musicid=A1.musicid) GROUPBY songcategoryid ) AS B ON B.songcategoryid=A.songcategoryid AND A.musicid ISNULL WHERE A.ID IN(SELECTMIN([ID]) FROM #T WHERE musicid ISNULLGROUPBY songcategoryid) --这里主要是考虑分组后UPDATE后,可能还所有一些(必定存在重复的)音乐 --这一段不用考虑唯一性,只要随机就ok。 --不要下面语句可能会死循环 IFNOTEXISTS(SELECT1FROM #ID AS A WHERENOTEXISTS(SELECT1FROM #T AS B WHERE B.[id]=A.[ID]AND B.musicid ISNULL)) BEGIN PRINT1 UPDATE A SET A.musicid=B.musicid FROM #T AS A INNERJOIN (SELECT songcategoryid,MIN(musicid) AS musicid FROM music_category AS A1 WHERE A1.musicid in(SELECTtop1 B1.musicid FROM music_category AS B1 WHERE B1.songcategoryid=A1.songcategoryid ORDERBYNEWID() DESC) GROUPBY songcategoryid ) AS B ON B.songcategoryid=A.songcategoryid AND A.musicid ISNULL WHERE A.ID IN(SELECTMIN([ID]) FROM #T WHERE musicid ISNULLGROUPBY songcategoryid) END TRUNCATETABLE #ID INSERTINTO #ID SELECTMIN([ID]) FROM #T WHERE musicid ISNULLGROUPBY songcategoryid END SELECT*FROM #T --ORDER BY songcategoryid DROPTABLE #T,#ID droptable plans,music_category /**//* 结果: id songcategoryid musicid 1 1 1 2 1 5 3 3 11 4 1 2 5 5 16 6 6 19 7 4 13 8 2 8 9 1 3 10 4 14 11 2 7 12 2 10 13 7 20 14 4 14 15 7 20 16 2 9 17 5 15 18 5 17 */