视图如下,其中A,B为两个子试图:
SELECT DISTINCT T.Time,T.TransID,T.Status,T.TransType
FROM
(SELECT Time,TransID,Status,TransType
FROM A
UNION
SELECT Time,TransID,Status,TransType
FROM B
) AS T
上面试图检索出来的结果有TransID重复的记录,对于TransID相同的记录,只取Time字段大的那一条。改进的视图如下:
SELECT DISTINCT T1.Time,T1.TransID,T1.Status,T1.TransType
FROM
(SELECT Time,TransID,Status,TransType
FROM A
UNION
SELECT Time,TransID,Status,TransType
FROM B
) AS T1 INNER JOIN(SELECT MAX(Time) AS MaxTime, TransID
 FROM
  (SELECT Time,TransID
   FROM A
   UNION
   SELECT Time,TransID
   FROM B
  ) AS Temp GROUP BY TransID
) AS T2
ON T1.Time=T2.MaxTime AND T1.TransID=T2.TransID
问题:
执行效率很低。由于业务量太大,库里至少有30万条数据,在这种情况下查询一次花费的时间太长。界面上其实每次最多能显示前1000条数据。各位帮忙看一下,如何优化。

解决方案 »

  1.   

    select a.* from
    (
      SELECT Time,TransID,Status,TransType FROM A
      UNION
      SELECT Time,TransID,Status,TransType FROM B
    ) t1,
    (
      select TransID , max(time) time from
      (
        SELECT Time,TransID,Status,TransType FROM A
        UNION
        SELECT Time,TransID,Status,TransType FROM B
      ) m
      group by Transid
    ) t2
    where t1.Transid = t2.transid and t1.time = t2.time
      

  2.   

    select a.* from
    (
      SELECT Time,TransID,Status,TransType FROM A
      UNION
      SELECT Time,TransID,Status,TransType FROM B
    ) t1 where Time in 
    (
      select max(time) time from
      (
        SELECT Time,TransID,Status,TransType FROM A
        UNION
        SELECT Time,TransID,Status,TransType FROM B
      ) m
      group by Transid
      

  3.   

    union 去重复,但看你写的视图, union 根本没有意义
      

  4.   

    --DISTINCT 多余
    SELECT DISTINCT T1.Time,T1.TransID,T1.Status,T1.TransType
    FROM
    (SELECT Time,TransID,Status,TransType
    FROM A
    UNION
    SELECT Time,TransID,Status,TransType
    FROM B
    ) AS T1 INNER JOIN(SELECT MAX(Time) AS MaxTime, TransID
     FROM
      (SELECT Time,TransID
       FROM A
       UNION
       SELECT Time,TransID
       FROM B
      ) AS Temp GROUP BY TransID
    ) AS T2
    ON T1.Time=T2.MaxTime AND T1.TransID=T2.TransID
      

  5.   

    我想你的两个子视图是不是来自多个表的字段啊???
    ---改成这样试试看
    Select X.* From (
          SELECT T.Time,T.TransID,T.Status,T.TransType
          FROM
             (SELECT Time,TransID,Status,TransType
              FROM A
              UNION ALL
              SELECT Time,TransID,Status,TransType
              FROM B) AS T
              ) AS X WHERE Not Exists
          (SELECT 1 FROM (
                   SELECT T.Time,T.TransID,T.Status,T.TransType
                   FROM
                      (SELECT Time,TransID,Status,TransType
                       FROM A
                       UNION ALL
                       SELECT Time,TransID,Status,TransType
                       FROM B) AS T
                       ) AS Y WHERE Y.TransID=X.TransID AND Y.Time>X.Time)
      

  6.   

    union去掉的是字段完全一样的纪录,我的查询里Time字段会有差别,所以会查出TransID相同的多个纪录。在试图A,B中都要union十几张数据表,同时,界面上一次最多显示1000记录,所以我想在查询表的时候就限定只查询每张表的前1000条记录。