【问题标题】:SQL join and filteringSQL 连接和过滤
【发布时间】:2020-07-10 10:57:53
【问题描述】:
这两种解决方案的结果是否相同?
SELECT *
FROM Orders
LEFT JOIN OrderLines ON OrderLines.OrderID=Orders.ID
AND Orders.ID = 12345
select orderID
into #temp
from OrderLines
where orderID=12345
SELECT *
FROM Orders
LEFT JOIN #temp t ON t.OrderID=Orders.ID
我想使用临时表来提高性能
【问题讨论】:
-
告诉我们您为什么认为他们这样做或不这样做,或者询问您在阅读文档时遇到的问题。你只是要求我们重写它,而不知道你为什么被卡住。 How to Ask
标签:
sql
sql-server
left-join
where-clause
temp-tables
【解决方案1】:
SELECT *
FROM Orders
LEFT JOIN OrderLines ON OrderLines.OrderID=Orders.ID
AND Orders.ID = 12345
这个查询会给你
-
Orders 表中的所有记录
-
OrderLines 表中的匹配记录仅适用于 Orders,而 ID = 12345 则适用于所有其他 Orders,您会发现 OrderLines Null。
--
select orderID
into #temp
from OrderLines
where orderID=12345
SELECT *
FROM Orders
LEFT JOIN #temp t ON t.OrderID=Orders.ID
让我们考虑您的第一个查询,您仅从OrderLines 获取那些记录,其中OrderId = 12345 然后将其与Orders 表连接起来。所以你的查询输出将是
-
Orders 表中的所有记录
- 对于 OrderID 12345,OrderLines 将可用,而对于所有其他人,
Orderlines 将为空
所以是的,两个查询都会给你相同的输出。
【解决方案2】:
我想使用临时表来提高性能
我的基本反应是:克服它。临时表在某些情况下很有用,特别是当脚本运行多个查询并需要共享某个子查询时。但是,它们会在创建表、加载数据以及再次读取表时产生开销。这可能是很多开销。
不过,总的来说,开发数据库及其优化器已经付出了很多努力。您通常可以相信优化器会做正确的事情。无需试图智取优化器。
有时,优化器并不完美。大多数数据库都支持使用一些提示来生成更合适的查询计划。在某些情况下,您可能会发现创建具有适当索引的临时表会产生更好的查询计划。
在大多数情况下,您的第一个查询将比您的第二个查询更快。如果不是,OrderLines 上的统计数据可能已经过时了。