子查询的 SQL 查询优化
Posted
技术标签:
【中文标题】子查询的 SQL 查询优化【英文标题】:SQL query optimization for subqueries 【发布时间】:2013-05-10 18:40:10 【问题描述】:我正在尝试加快存储过程,并有以下子查询:
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 语句什么的,但不太清楚如何写。
我问这个是因为我读到最好尽量减少子查询以提高性能。
【问题讨论】:
这是有效的语法吗?子查询中的 FROM 在哪里? 请提供完整有效的查询。 你为什么选择它作为两个单独的列? "...我读到最好尽量减少子查询以提高性能。" 您希望更改会有所帮助。希望不能很好地扩展。改为学习阅读execution plan。 @MartinSmith 哦,太恶心了。现在我们如何忘记这一点。 【参考方案1】:尝试使用 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 但请不要将'single quotes'
用作别名 - 某些形式的此类已被弃用,这使它们看起来非常像字符串文字。 [square brackets]
是首选。
@Mike - 谢谢,这就是我要找的东西!...感谢大家的意见。【参考方案2】:
您可以尝试对 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
我不确定这是否对您有所帮助...!总之……
【讨论】:
以上是关于子查询的 SQL 查询优化的主要内容,如果未能解决你的问题,请参考以下文章