2017-05-29 1 views
1

私はテーブルT1とT2を2つ持っています。このクエリのSQL文を最適化しますか?

T1 ID、F1、F2、F3、F4、F5、F6、F7、F8

T2有するID、T1_ID、F1、F2、F3、F4、F5、F6、F7、F8、SUMを有します有するT1.F8 T1.F1 ...(1と2と3)

クエリがレコード1を返す必要

選択* T2から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 
    . 
    . 
ため

としてデータを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) 
    . 
    . 
    . 

このクエリを作成します。 ステートメントを最適化するにはどうすればよいですか?

+0

すでに似たような質問があります。 (同じにさえ)そこには2つの答えがあり、あなたはそれらに反応がありません。以前の質問を編集してください。 –

+1

[このテーブルに最も適したSQLステートメント?]の複製がありますか(https://stackoverflow.com/questions/44179634/best-sql-statement-for-this-table) –

+0

質問は似ていますが同じではありません。 2番目のテーブルでは、2つのテーブルを比較して、より良いステートメントを探しています。 – user2531567

答えて

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 
     );