sql联接和筛选

1tuwyuhd  于 2021-07-24  发布在  Java
关注(0)|答案(2)|浏览(295)

这两种解决方案的结果相同吗?

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

我想用临时表来表现

fivyi3re

fivyi3re1#

SELECT *
FROM Orders
LEFT JOIN OrderLines ON OrderLines.OrderID=Orders.ID 
    AND Orders.ID = 12345

此查询将为您提供
所有的记录 Orders table
匹配的记录来自 OrderLines 仅适用于带有 ID = 12345 对于所有其他订单,您将发现订单行为空。

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 table。因此您的查询输出将
所有的记录 Orders table
对于医嘱ID 12345,医嘱行将可用,对于所有其他医嘱行, Orderlines 将为空
所以是的,两个查询都将提供相同的输出。

nnt7mjpx

nnt7mjpx2#

我想用临时表来表现
我的基本React是:克服它。临时表在某些情况下非常有用,特别是当脚本运行多个查询并且需要共享某个子查询时。但是,它们会在创建表、用数据加载表,然后再次读取表时产生开销。这可能是一个很大的开销。
不过,总的来说,在开发数据库及其优化器方面付出了大量的努力。您通常可以相信优化器会做正确的事情。没有必要试图胜过优化器。
有时,优化器并不完美。大多数数据库都支持使用提示来生成更合适的查询计划。在某些情况下,您可能会发现使用适当的索引创建临时表会产生更好的查询计划。
在大多数情况下,第一个查询将比第二个查询快。如果不是的话 OrderLines 可能已经过时了。

相关问题