SQL如下:
         SELECT T.*, C.FK_DEPT_ID, '' AS FK_BASE_ID
         FROM T_BULLETIN_INFO T, T_BULLETIN_DEPT C
                 WHERE C.FK_BULLETION_ID = T.PK_ID
                UNION
                SELECT T.*, '' AS FK_DEPT_ID, B.FK_BASE_ID
                  FROM T_BULLETIN_INFO T, T_BULLETIN_BASE B
                 WHERE B.FK_BULLETION_ID = T.PK_ID
T_BULLETIN_INFO信息表有33条数据。T_BULLETIN_DEPT 部门表有90条数据。
T_BULLETIN_BASE 基表有300条数据。本来查询出来的信息本来最多是33条数据的,现在缺成了390条数据,而且检查了下sql也没有写错啊!这是为什么呢?

解决方案 »

  1.   

    楼主用了union,
    第一个查询最多33条。
    但是第2个查询最多也33条。
    而且第一个查询和第2个查询几乎不可能发生重复。
    要想看看为什么,就分别执行第一个查询和第2个查询。
      

  2.   

    T_BULLETIN_INFO表里的数据不一定就对应T_BULLETIN_DEPT 表的一条数据
    你可以分别查一下SELECT T.*, C.FK_DEPT_ID, '' AS FK_BASE_ID 
            FROM T_BULLETIN_INFO T, T_BULLETIN_DEPT C 
                    WHERE C.FK_BULLETION_ID = T.PK_ID 

                    SELECT T.*, '' AS FK_DEPT_ID, B.FK_BASE_ID 
                      FROM T_BULLETIN_INFO T, T_BULLETIN_BASE B 
                    WHERE B.FK_BULLETION_ID = T.PK_ID就应该明白是为什么了
      

  3.   

    比如 T_BULLETIN_INFO 有一个pk_id=1;
     T_BULLETIN_BASE中 FK_BULLETION_ID可能就多个等于1的
    这样就会出现多条记录
    因为是进行的笛卡尔乘积
      

  4.   

    你分别把两个分句执行以下,看下每个的结果条数,你用的union
    最后的结果不会超过他们的和
      

  5.   

    3楼分析的正确,但不是笛卡尔乘积。因为 WHERE C.FK_BULLETION_ID = T.PK_ID 这个条件存在, 如果是笛卡尔乘积,那结果应该是33*300