怎样确定选题结果?
学生选题表(sdu_id,ques_id ,指标1,指标2),每个学生选择多到题。 
教师出题表(ques_id,tea_id)每个教师出多道题。 
教师限制表(tea_id,max)该教师最多指导学生做题数。 
要求: 
  对于选题表先根据指标1,2降序排列。选择该同学指标1,2尽量靠前(因为还要满足该出题教师指导学生的限制)的1道题。还要保证一道题只能由1个同学选择! 
我理解的执行过程:
首先根据对选题表按指标1,2排序。 
然后逐行查看每条选题记录: 
  (1).看该同学是否已经确定出一道题 ,“是” 取下一条记录,“否” 检查(2) 
  (2).看该题是否已经被一个同学选择,“是” 取下一条记录,“否” 检查(3) 
  (3).再检查该出题教师指导学生是否达到限制,“是”取下一条,“否” 这该题由当前同学做! 
结果 确定出每一个同学选择的题,有可能有的同学不能选到题。 
结果可以是另外一张表,也可以加一个字段flag标识。 假设像如下的数据:
教师限制表: 
    tea_id  max 
    t1001    2 
    t1005    2 
    t1006    1 
    …… 
教师出题表:每个教师给出3道题供学生选择 
  ques_id  tea_id 
    q1001  t1001 
    q1002  t1001 
    q1003  t1005 
    q1004  t1006 
    q1005  t1001 
    q1006  t1005 
    q1007  t1005 
    q1008  t1006 
    q1009  t1006 
    …… 
学生选题表:根据指标1,2排好序 
  stu_id  ques_id  指标1  指标2 
    s1002  q1005    99    95 
    s1003  q1001    99    93 
    s1001  q1001    95    92 
    s1003  q1006    94    90 
    s1004  q1002    92    90 
    ……上面记录: 
  s1002  q1005    99    95  --(1),(2),(3)都满足,则确定他选本题 
  s1003  q1001    99    93  --(1),(2),(3)都满足,则确定他选本题 
  s1001  q1001    95    92  --(2)不满足,取下一条 
  s1003  q1006    94    90  --(1)不满足,取下一条 
  s1004  q1002    92    90  --(3)不满足,取下一条 
   …… 
怎么来实现,各位有什么好的办法? 

解决方案 »

  1.   

    WHILE 循环应该也可以的吧
      

  2.   

    select * into #as from 学生选题表 order by 指标1 desc,指标2 descalter table #as add idd int IDENTITY (1, 1)--满足
    select a1.* from #as a1 where idd =(select min(idd) from #as a2 where a1.ques_id=a2.ques_id)--不满足
    select a1.* from #as a1 where idd <(select min(idd) from #as a2 where a1.ques_id=a2.ques_id)
      

  3.   

    IF OBJECT_ID('TeaMax') IS NOT NULL DROP TABLE TeaMax 
    GO
    CREATE TABLE TeaMax(TEA_ID VARCHAR(10),NUM int)
    INSERT INTO TeaMax SELECT 't1001',2
    UNION ALL SELECT  't1005',2
    UNION ALL SELECT  't1006',1IF OBJECT_ID('QueTea') IS NOT NULL DROP TABLE QueTea 
    GO
    CREATE TABLE QueTea(Ques_ID VARCHAR(10),Tea_id VARCHAR(10))
    INSERT INTO QueTea SELECT 'q1001','t1001'
    UNION ALL SELECT  'q1002','t1001'
    UNION ALL SELECT  'q1003','t1005'
    UNION ALL SELECT  'q1004','t1006'
    UNION ALL SELECT  'q1005','t1001'
    UNION ALL SELECT  'q1006','t1005'
    UNION ALL SELECT  'q1007','t1005'
    UNION ALL SELECT  'q1008','t1006'
    UNION ALL SELECT  'q1009','t1006'IF OBJECT_ID('StuQue') IS NOT NULL DROP TABLE StuQue 
    GO
    CREATE TABLE StuQue(Stu_ID VARCHAR(10),Ques_ID VARCHAR(10),CHECK1 INT,CHECK2 INT)
    INSERT INTO StuQue SELECT 's1002','q1005',99,95
    UNION ALL SELECT  's1003','q1001',99,93
    UNION ALL SELECT  's1001','q1001',95,92
    UNION ALL SELECT  's1003','q1006',94,90
    UNION ALL SELECT  's1004','q1002',92,90IF OBJECT_ID('TEMPDB.DBO.#T') IS NOT NULL DROP TABLE #T
    GO
    SELECT * ,IDNO=IDENTITY(INT,1,1)INTO #T FROM StuQue
    IF OBJECT_ID('TEMPDB.DBO.#TB') IS NOT NULL DROP TABLE #TB
    GO
    SELECT A.*,B.NUM  INTO #TB  FROM 
    (SELECT A.*,B.Tea_id FROM #T A 
    INNER JOIN QueTea B
      ON A.Ques_ID=B.Ques_ID 
    WHERE NOT EXISTS(SELECT 1 FROM #T WHERE Stu_ID=A.Stu_ID AND CHECK1>A.CHECK1 ))A
    INNER JOIN TeaMax B
     ON A.Tea_id=B.Tea_id
    ORDER BY IDNO
    SELECT A.Stu_ID,A.Ques_ID,A.CHECK1,A.CHECK2 FROM #TB A
    WHERE (SELECT COUNT(1) FROM #TB WHERE Tea_id=A.Tea_id AND IDNO<=A.IDNO )<=A.NUM
    ORDER BY IDNO
    --满足的结果
    /*Stu_ID     Ques_ID    CHECK1      CHECK2      
    ---------- ---------- ----------- ----------- 
    s1002      q1005      99          95
    s1003      q1001      99          93(所影响的行数为 2 行)
    */
      

  4.   

    --改下7楼的
    IF OBJECT_ID('TEMPDB.DBO.#T') IS NOT NULL DROP TABLE #T
    GO
    SELECT * ,IDNO=IDENTITY(INT,1,1)INTO #T FROM StuQueIF OBJECT_ID('TEMPDB.DBO.#TB') IS NOT NULL DROP TABLE #TB
    GO
    SELECT A.*,B.NUM  INTO #TB  FROM 
    ( SELECT A.*,B.Tea_id FROM #T A 
      INNER JOIN QueTea B  ON A.Ques_ID=B.Ques_ID 
      WHERE NOT EXISTS(SELECT 1 FROM #T WHERE Stu_ID=A.Stu_ID AND idno<A.idno )--1处
        and NOT EXISTS(SELECT 1 FROM #T WHERE Ques_ID=A.Ques_ID AND idno<A.idno )--2处
    )A INNER JOIN TeaMax B ON A.Tea_id=B.Tea_id
    ORDER BY IDNOSELECT A.Stu_ID,A.Ques_ID,A.CHECK1,A.CHECK2 FROM #TB A
    WHERE (SELECT COUNT(1) FROM #TB WHERE Tea_id=A.Tea_id AND IDNO<=A.IDNO )<=A.NUM
    ORDER BY IDNO
    --原因:用CHECK1不甚严密,既然有了idno直接用它好了(idno<A.idno )
    --2处:漏了“还要保证一道题只能由1个同学选择!”这个条件,这里的数据是老师刚好是两道,如果是3道就会出现同一道题被两个人选的现象。(and NOT EXISTS(SELECT 1 FROM #T WHERE Ques_ID=A.Ques_ID AND idno<A.idno )) 
      

  5.   

    --2处:漏了“还要保证一道题只能由1个同学选择!”这个条件 (没有过虑就是变成一个老师辅导多个学生,这个可以放到3条件里过虑)我是觉得这个可以跟最后(3)一样的
    到最后就取出,过虑老师最大限制的学生数 :WHERE (SELECT COUNT(1) FROM #TB WHERE Tea_id=A.Tea_id AND IDNO <=A.IDNO ) <=A.NUM 
    wgzaaa这个仁兄,不知道我这样的理解是否正确