0

使用子连接时,我注意到产生相同结果的两种不同方式。在子连接中,使用“选择”连接两个表,然后给它一个别名,该别名将在后续行中引用。另一个只是“匿名”连接两个表,后续行使用 Sub-Join 的表别名。我有下面的示例代码。我的问题是:

  1. 这些是等价的吗?一个只是节省击键?

  2. 使用“选择”的人是否创建了一个临时表,而另一个人没有?

  3. 两者之间会有性能差异吗?我认为不会有基于执行分析器的,但我想我会问。

  4. 是否有一个或其他“子连接样式”的“名称”(例如,别名子连接与匿名子连接?)

  5. 就表名和列名别名的范围规则而言,是否有任何好的文档可以有人指出我可以解释这样的情况?我已经搜索并找不到任何匹配的内容(尽管我不确定我是否“正确”搜索)?

这是两个查询:

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;
4

2 回答 2

2

我进一步研究了这个主题,并找到了我正在寻找的答案。我希望这对将来的其他人有所帮助。

在“子查询”上执行 JOIN 时,与第一种情况一样,您必须为子查询提供别名,因此在引用来自该子查询的数据时必须使用该别名。加入子查询可以让您更详细地控制将返回的字段以及它们的格式等,因此在某些情况下,当您需要“自定义”数据时,这可能是更可取的。从这样的子查询返回的数据可以称为“虚拟表”或“派生表”等。

我的示例中的第二种情况只是“Mutli-Join”。它本身并没有什么特别之处。它涉及更少的输入,并且在不需要自定义返回字段时可能更可取。

这两个查询在我的环境中产生相同的执行路径。YMMV。

这是一篇很好的文章,它解释了子查询和连接(以及其他子查询主题)以获得更完整的描述: https ://www.simple-talk.com/sql/sql-training/subqueries-in-sql-server/

于 2013-02-26T17:39:52.033 回答
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)

返回,不是 b1 = Bugs 和 b2 = Bugs,因此是同一张表

于 2013-02-22T21:43:41.807 回答