我要做一个论坛,其中有两个表,一个表为tb1用来存放提问的问题,另一个表为tb2,用来存放针对tb1中的每个问题所做的答复。两个表的字段如下:tb1:
问题编号
提问人
问题标题
问题内容
提问时间tb2:
问题编号
答复人
答复时间
答复内容
tb1中有数据:
问题编号  提问人  问题标题   问题内容     提问时间
  001    pname1  topic1    content1   2008-1-1
  002    pname2  topic2    content2   2008-1-2tb2中有数据:(“问题编号”为关联字段)
问题编号  答复人  答复时间   答复内容
  001    xname1  2008-1-1  xcontent1
  001    xname2  2008-1-2  xcontent2
  001    xname3  2008-1-3  xcontent3从上述tb1和tb2数据中我想得到下列结果:问题编号  问题标题   提问人     提问时间   回复数  最后答复时间 最后答复人
 001      topic1   pname1   2008-1-1    2    2008-1-3    xname3
 002      topic2   pname2   2008-1-2    0     null        null
 
sql语句应该如何写,请指教!

解决方案 »

  1.   

    ---------------------------------
    --  Author: liangCK 小梁
    ---------------------------------
     
    --> 生成测试数据: @tb1
    DECLARE @tb1 TABLE (问题编号 VARCHAR(3),提问人 VARCHAR(6),问题标题 VARCHAR(6),问题内容 VARCHAR(8),提问时间 DATETIME)
    INSERT INTO @tb1
    SELECT '001','pname1','topic1','content1','2008-1-1' UNION ALL
    SELECT '002','pname2','topic2','content2','2008-1-2'
     
    --> 生成测试数据: @tb2
    DECLARE @tb2 TABLE (问题编号 VARCHAR(3),答复人 VARCHAR(6),答复时间 DATETIME,答复内容 VARCHAR(9))
    INSERT INTO @tb2
    SELECT '001','xname1','2008-1-1','xcontent1' UNION ALL
    SELECT '001','xname2','2008-1-2','xcontent2' UNION ALL
    SELECT '001','xname3','2008-1-3','xcontent3'--SQL查询如下:SELECT
        A.问题编号,
        A.问题标题,
        A.提问人,
        A.提问时间,
        B.回复数,
        B.最晚答复时间,
        C.答复人 AS 最晚答复人
    FROM @tb1 AS A
        LEFT JOIN (
            SELECT
                问题编号,
                COUNT(*) AS 回复数,
                MAX(答复时间) AS 最晚答复时间
            FROM @tb2
            GROUP BY 问题编号
        ) AS B
            ON A.问题编号=B.问题编号
        LEFT JOIN @tb2 AS C
            ON B.问题编号=C.问题编号
                AND B.最晚答复时间=C.答复时间/*
    问题编号 问题标题   提问人    提问时间                    回复数         最晚答复时间                  最晚答复人
    ---- ------ ------ ----------------------- ----------- ----------------------- ------
    001  topic1 pname1 2008-01-01 00:00:00.000 3           2008-01-03 00:00:00.000 xname3
    002  topic2 pname2 2008-01-02 00:00:00.000 NULL        NULL                    NULL(2 行受影响)
    */
      

  2.   

    select a.*,isnull(b.回复数,0) as 回复数,b.最后答复时间,c.答复人 as 最后答复人
    from tb1 a left join (
     select 问题编号,count(1) as 回复数,max(答复时间) as 最后答复时间
     from tb2
     group by 问题编号
     ) as b on a.问题编号=b.问题编号
    left join tb2 c on b.问题编号=c.问题编号 and b.最后答复时间 = c.答复时间