0

サブクエリから列を取得することに関するいくつかの投稿を見ましたが、それらのほとんどは各列に単一の選択を使用することを提案していますが、これは私の場合です

SELECT CAST(p.idvendor AS VARCHAR(10)), CAST(p.description AS VARCHAR(50)),  
(SELECT CAST(NVL(SUM(CASE WHEN locals_sales.cantidad >=0
                           AND locals_sales.cantidad <locals_sales.pqlocals
                     THEN 1 ELSE 0 END), '0') AS VARCHAR(10)) 
   FROM locals_sales, agents, vendors, locals, locals_sales, history
  WHERE locals.idvendor = vendors.idvendor 
    AND locals_sales.IDlocals = locals.idlocals
    AND agents.codagente=vendors.codagente
    AND agents.idagent!=1
    AND locals_sales.number_n_line = locals_sales.n_line
    AND locals.estado=1
    AND vendors.idvendor = p.idvendor
    AND history.number_line(+) = locals_sales.n_line
    AND history.date(+) >= to_date('4/9/2012 00:00', 'dd/mm/yy HH24:mi:ss')
 ) AS critic, 
(SELECT CAST(NVL(SUM(CASE WHEN locals_sales.cantidad >=locals_sales.pqlocals
                           AND locals_sales.cantidad <locals_sales.media
                     THEN 1 ELSE 0 END), '0') AS VARCHAR(10))
   FROM locals_sales, agents, vendors, locals, locals_sales, history
  WHERE locals.idvendor = vendors.idvendor
    AND locals_sales.IDlocals = locals.idlocals
    AND agents.codagente=vendors.codagente
    AND agents.idagent!=1
    AND locals_sales.number_n_line = locals_sales.n_line
    AND locals.estado=1
    AND vendors.idvendor = p.idvendor
    AND history.number_line(+) = locals_sales.n_line
    AND history.date(+) >= to_date('4/9/2012 00:00', 'dd/mm/yy HH24:mi:ss')
 ) AS medium, 
(SELECT CAST(NVL(SUM(CASE WHEN locals_sales.cantidad >=locals_sales.media
                     THEN 1 ELSE 0 END), '0') AS VARCHAR(10))
   FROM locals_sales, agents, vendors, locals, locals_sales, history
  WHERE locals.idvendor = vendors.idvendor
    AND locals_sales.IDlocals = locals.idlocals
    AND agents.codagente=vendors.codagente
    AND agents.idagent!=1
    AND locals_sales.number_n_line = locals_sales.n_line
    AND locals.estado=1
    AND vendors.idvendor = p.idvendor
    AND history.number_line(+) = locals_sales.n_line
    AND history.date(+) >= to_date('4/9/2012 00:00', 'dd/mm/yy HH24:mi:ss')
 ) AS NORMAL 
 FROM vendors p, agents ag
WHERE ag.codagente=p.codagente

ご覧のとおり、各列に 3 つの SUM があります。これらの列は同じテーブルからのものです。違いは、各選択の各 CASE の前提条件によるものです。

また、各選択のほぼ最後に、これを条件として持っています

vendors.idvendor = p.idvendor

p は、サブクエリの外側のテーブルのエイリアスです

パフォーマンスを向上させるために、ほぼ同様の 3 つの選択を使用せずに、代わりに 3 つの列に対して単一の選択を使用するにはどうすればよいですか?

4

1 に答える 1

1

これは、サブクエリを FROM 句に移動し、適切な結合を行うことで処理できます。

最終的なクエリは次のようになります。

select CAST(p.idvendor AS VARCHAR(10)), CAST(p.description AS VARCHAR(50)),
       s.val1, s.val2, sl.val3
from vendors p join
     agents ag 
     on p.codeagent = ag.codeagent join
     (<a variation of your subquery here with all three columns defined and idvendor in the select list>
     ) s
     on p.idvendors= s.idvendor

また、クエリを読みやすくするために、適切な結合構文を使用する必要があります。

于 2012-09-04T20:37:08.133 に答える