优化此查询的SQL语句?

时间:2017-05-29 11:58:26

标签: firebird

我有两张桌子T1和T2。

T1有ID,F1,F2,F3,F4,F5,F6,F7,F8

T2有ID,T1_ID,F1,F2,F3,F4,F5,F6,F7,F8,SUM

T1和T2的示例数据

 T1
 ID,F1,F2,F3,F4,F5,F6,F7,F8
  1, 1, 2, 3, 0, 0, 5, 0, 0
  2, 0, 0, 0, 1, 0, 4, 5, 0
  3, 4, 1, 3, 2, 0, 0, 0, 5
  4, 1 ,3, 4, 0, 0 ,0, 0, 0
  5, 7, 2, 1, 3, 0, 0, 0, 0
  .
  . 
  .
 T2 
 ID,T1_ID,F1,F2,F3,F4,F5,F6,F7,F8,SUM
  1,    1, 2, 3, 5, 0, 0, 3, 0, 0,100
  2,    5, 9, 8, 8, 1, 0, 0, 0, 0,200
  3,    2, 0, 0, 0, 5, 0, 6, 6, 0,300 
  4,    1 ,3, 4, 2, 0 ,0, 3, 0, 0,255 
  5,    4, 8, 8, 8, 0, 0, 0, 0, 0,155
  .
  .  

从T2中选择*,其中T1.F1 .... T1.F8具有(1和2和3)

查询必须返回记录1,2,4

  1,    1, 2, 3, 5, 0, 0, 3, 0, 0,100
  2,    5, 9, 8, 8, 1, 0, 0, 0, 0,200
  4,    1 ,3, 4, 2, 0 ,0, 3, 0, 0,255 

我创建了这个查询

Select T2.ID,T2.F1,T2.F2,T2.F3,T2.F4.T2.F5,T2.F6,T2.F7,T2.F8,T2.SUM,T1.ID
from T2 
 join T1 on T1.ID = T2.T1_ID
    where 
    (CASE WHEN ( T1_ID.F1 = 1 ) THEN T2.F1 between 0 and 1000 end)
 and(CASE WHEN ( T1_ID.F1 = 2 ) THEN T2.F1 between 0 and 1000 end)
 and(CASE WHEN ( T1_ID.F1 = 3 ) THEN T2.F1 between 0 and 1000 end)
  or
    (CASE WHEN ( T1_ID.F1 = 1 ) THEN T2.F1 between 0 and 1000 end)
 and(CASE WHEN ( T1_ID.F2 = 2 ) THEN T2.F2 between 0 and 1000 end)
 and(CASE WHEN ( T1_ID.F1 = 3 ) THEN T2.F1 between 0 and 1000 end)
  or
    (CASE WHEN ( T1_ID.F1 = 1 ) THEN T2.F1 between 0 and 1000 end)
 and(CASE WHEN ( T1_ID.F3 = 2 ) THEN T2.F3 between 0 and 1000 end)
 and(CASE WHEN ( T1_ID.F1 = 3 ) THEN T2.F1 between 0 and 1000 end)
  or
    (CASE WHEN ( T1_ID.F1 = 1 ) THEN T2.F1 between 0 and 1000 end)
 and(CASE WHEN ( T1_ID.F4 = 2 ) THEN T2.F4 between 0 and 1000 end)
 and(CASE WHEN ( T1_ID.F1 = 3 ) THEN T2.F1 between 0 and 1000 end)
   .
   .
   .
  or
   (CASE WHEN ( T1_ID.F2 = 1 ) THEN T2.F2 between 0 and 1000 end)
and(CASE WHEN ( T1_ID.F1 = 2 ) THEN T2.F1 between 0 and 1000 end)
and(CASE WHEN ( T1_ID.F1 = 3 ) THEN T2.F1 between 0 and 1000 end)
  or
   (CASE WHEN ( T1_ID.F2 = 1 ) THEN T2.F2 between 0 and 1000 end)
and(CASE WHEN ( T1_ID.F2 = 2 ) THEN T2.F2 between 0 and 1000 end)
and(CASE WHEN ( T1_ID.F1 = 3 ) THEN T2.F1 between 0 and 1000 end)
  or
   (CASE WHEN ( T1_ID.F2 = 1 ) THEN T2.F2 between 0 and 1000 end)
and(CASE WHEN ( T1_ID.F3 = 2 ) THEN T2.F3 between 0 and 1000 end)
and(CASE WHEN ( T1_ID.F1 = 3 ) THEN T2.F1 between 0 and 1000 end)
  .
  .
  .
这是太大的说法。 我该如何优化声明?

1 个答案:

答案 0 :(得分:0)

SELECT * FROM  T2
WHERE  EXISTS (   SELECT   N.ID
              FROM(   SELECT T1.ID , T1.F1 AS F
                           FROM   T1
                           UNION ALL
                           SELECT T1.ID , T1.F2 AS F
                           FROM   T1
                           UNION ALL
                           SELECT T1.ID , T1.F3 AS F
                           FROM   T1
                           UNION ALL
                           SELECT T1.ID , T1.F4 AS F
                           FROM   T1
                           UNION ALL
                           SELECT T1.ID , T1.F5 AS F
                           FROM   T1
                           UNION ALL
                           SELECT T1.ID , T1.F6 AS F
                           FROM   T1
                           UNION ALL
                           SELECT T1.ID , T1.F7 AS F
                           FROM   T1
                           UNION ALL
                           SELECT T1.ID , T1.F8 AS F
                           FROM   T1
                           UNION ALL
                       ) N
              WHERE    N.F IN ( 1, 2, 3 )
                       AND N.ID = T2.T1_ID
              GROUP BY N.ID
              HAVING   COUNT(DISTINCT N.F) = 3
          );