子查询的SQL查询优化

时间:2013-05-10 18:40:10

标签: sql-server subquery query-optimization

我正在尝试加速存储过程,并具有以下子查询:

    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声明或其他什么,但不太确定如何写它。

我问这个是因为我读到最小化子查询以提高性能是好的。

2 个答案:

答案 0 :(得分: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] 

答案 1 :(得分:0)

您可以尝试使用与SQL Server等效的oracle“UNION”。我曾经使用过Oracle 10g,你可以使用like,

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

我不确定这是否对你有帮助...... !!反正...