【问题标题】: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 上的统计数据可能已经过时了。

    【讨论】:

      猜你喜欢
      • 2022-10-12
      • 2019-02-23
      • 2012-03-14
      • 2021-12-25
      • 2017-03-10
      • 1970-01-01
      • 2022-08-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多