SQL Sub-Join语法

时间:2013-02-22 19:34:16

标签: sql join scope alias

使用子连接时,我注意到有两种不同的方法可以产生相同的结果。在子连接中,使用'select'连接两个表,然后为其提供在后续行中引用的别名。另一个只是'匿名'加入两个表,后续行使用Sub-Join的表别名。我有下面的示例代码。我的问题是:

  1. 这些是等效的吗?只需保存按键?

  2. 使用'select'的人是否会创建一个临时表而另一个不是?

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

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

  5. 就表名和列名的别名的范围规则而言,是否有人可以指出哪些好文件可以解释这些情况?我搜索过,找不到匹配的东西(虽然我不确定我是否'正确搜索')?

  6. 以下是两个查询:

    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;
    

2 个答案:

答案 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,因此表格相同