0

ストアド プロシージャを高速化しようとしており、次のサブクエリがあります。

    SELECT
    ...
        ISNULL((SELECT Table1.Order WHERE Table2.STATUS <> 'R'),0) AS 'Order',
        ISNULL((SELECT Table1.Order WHERE Table2.STATUS = 'R'),0) AS 'Reject',
    ...
FROM Table1
LEFT JOIN
Table2
ON Table1.KEY=Table2.KEY

上記をより効率的に書く方法はありますか?

IF文か何かを考えていたのですが、書き方がよくわかりません。

サブクエリを最小限に抑えてパフォーマンスを向上させるのは良いことだと読んだので、これを尋ねています。

4

2 に答える 2

3

CASE WHEN を使用してみてください:

SELECT 
       /* ... */
       [Order] = CASE
                   WHEN t2.STATUS <> 'R' THEN t1.[Order]
                   ELSE 0
                 END,
       Reject = CASE
                  WHEN t2.STATUS = 'R' THEN t1.[Order]
                  ELSE 0
                END
       /* ... */                
FROM   Table1 t1
       LEFT JOIN Table2 t2
         ON t1.[KEY] = t2.[KEY] 
于 2013-05-10T18:52:36.787 に答える
0

SQL Server に相当する oracle "UNION" を使用してみることができます。私はOracle 10gに取り組んできましたが、次のように使用できます。

SELECT Table1.Order 
FROM Table1, Table2 
WHERE Table2.STATUS <> 'R' and Table1.id=Table2.id

UNION or UNION ALL

SELECT Table1.Order 
FROM Table1, Table2 
WHERE Table2.STATUS = 'R' and Table1.id=Table2.id

これが役に立ったかどうかはわかりません...!! いずれかの方法...

于 2013-05-10T18:59:22.310 に答える