使用子连接时,我注意到有两种不同的方法可以产生相同的结果。在子连接中,使用'select'连接两个表,然后为其提供在后续行中引用的别名。另一个只是'匿名'加入两个表,后续行使用Sub-Join的表别名。我有下面的示例代码。我的问题是:
这些是等效的吗?只需保存按键?
使用'select'的人是否会创建一个临时表而另一个不是?
两者之间是否会有任何性能差异?我不认为会有基于执行分析器但我想我会问。
是否存在一个或其他“子连接样式”的“名称”(例如别名子连接与匿名子连接?)
就表名和列名的别名的范围规则而言,是否有人可以指出哪些好文件可以解释这些情况?我搜索过,找不到匹配的东西(虽然我不确定我是否'正确搜索')?
以下是两个查询:
SELECT bp1.*, b1.*
from Bugs b1
JOIN BugsProducts bp1 ON b1.bug_id = bp1.bug_id
LEFT OUTER JOIN (select b2.*, bp2.product_id
from Bugs b2
JOIN BugsProducts bp2 ON b2.bug_id = bp2.bug_id) AS sub1
ON (bp1.product_id = sub1.product_id AND (b1.date_reported < sub1.date_reported))
WHERE sub1.bug_id IS NULL;
SELECT bp1.*, b1.*
from Bugs b1
JOIN BugsProducts bp1 ON b1.bug_id = bp1.bug_id
LEFT OUTER JOIN (Bugs b2 JOIN BugsProducts bp2 ON b2.bug_id = bp2.bug_id)
ON (bp1.product_id = bp2.product_id AND (b1.date_reported < b2.date_reported))
WHERE b2.bug_id IS NULL;
答案 0 :(得分:2)
我进一步研究了这个主题并找到了我想要的答案。我希望将来可以帮助其他人。
在'子查询'上执行JOIN时,与第一种情况一样,您必须为子查询提供别名,因此在引用该子查询中的数据时必须使用该别名。加入子查询可以更详细地控制将返回哪些字段以及如何格式化等等。因此,在某些情况下,当您需要“自定义”数据时,这可能更为可取。从这样的子查询返回的数据可以称为“虚拟表”或“派生表”等。
我的例子中的第二个案例就是'Mutli-Join'。它本身并没有什么特别之处。它涉及较少的输入,并且在不需要自定义返回字段时可能更为可取。
两个查询在我的环境中生成相同的执行路径。 YMMV。
这是一篇很好的文章,它解释了子查询和连接(以及其他子查询主题),以获得更完整的描述: https://www.simple-talk.com/sql/sql-training/subqueries-in-sql-server/
答案 1 :(得分:0)
你能用这个吗? :
SELECT bp1.*, b1.*
FROM bugs b1, bugsproducts bp1
WHERE b1.bug_id = bp1.bug_id AND b1.bug_is IS NULL
因为别名对我来说似乎更容易,更清洁,更短的代码
应该是什么
(b1.date_reported < b2.date_reported)
return,isnt b1 = Bugs和b2 = Bugs,因此表格相同