令人困惑的SQL Server代码

时间:2012-08-06 13:40:19

标签: sql sql-server

我想知道是否有人可以帮我理解这段代码的作用。我已经内置了一个SQL脚本,我正在尝试更新代码,因此它更容易阅读。我已经看了下面的代码,似乎有一种更简单的方法可以做到这一点,但我无法理解这段代码实际上在做什么。任何人都可以帮我描述一下这段代码吗? (也许我想知道如何使用子查询或EXISTS或更简单的方式来阅读它?

SELECT DISTINCT
    s.id
    ,f.FLAG1
    ,f.FLAG1
    ,f.FLAG1
INTO #DLK_TEMP
from Inner_Source D
    LEFT OUTER JOIN Outer_Source_1 S on D.au = S.AU 
        AND D.wcv_entity_key = S.wcv_entity_key 
    LEFT OUTER JOIN Outer_Source_2 F on S.id = F.id
WHERE S.id IS NOT NULL 

4 个答案:

答案 0 :(得分:2)

它似乎很奇怪,它在LEFT OUTER JOIN上执行S,然后测试连接成功的那些行。它应该是INNER JOIN。如果S.ID不可为空,那么您也可以删除WHERE子句。

SELECT DISTINCT
    s.id
    ,f.FLAG1
    ,f.FLAG1
    ,f.FLAG1
INTO #DLK_TEMP
FROM Inner_Source AS D
JOIN Outer_Source_1 AS S
    ON D.au = S.AU 
    AND D.wcv_entity_key = S.wcv_entity_key 
LEFT OUTER JOIN Outer_Source_2 AS F
ON S.id = F.id

如果您愿意,可以将第一个连接更改为EXISTS子句,以明确该连接仅用作过滤器:

SELECT DISTINCT
    s.id
    ,f.FLAG1
    ,f.FLAG1
    ,f.FLAG1
INTO #DLK_TEMP
FROM Outer_Source_1 AS S
LEFT OUTER JOIN Outer_Source_2 AS F ON S.id = F.id
WHERE EXISTS
(
    SELECT *
    FROM Inner_Source AS D
    WHERE D.au = S.AU 
    AND D.wcv_entity_key = S.wcv_entity_key
)

答案 1 :(得分:0)

INTO #DLK_TEMP

是一个临时表(在连接关闭时被销毁),你正在插入一个双重激动的外连接。

答案 2 :(得分:0)

几乎在所有情况下,连接都比子查询更好,因为您具体告诉优化器要连接哪些字段。在某些情况下,优化程序可以更改子查询 以加入,在这种情况下,您可以获得相同的性能,但在其他情况下,它将是未编入索引的O(n^2)搜索。

至于具体做什么,它将Inner_SourceOuter_Source_1Outer_Source_2连接在一起(特别是外连接,即使某些表中缺少连接字段,也意味着你会得到行(尽管第一个连接几乎是一个内连接..))并将结果数据集中的几个字段插入临时表#DLK_TEMP

您应该阅读联接,因为它们是数据库设计和编程的主要内容。你的查询非常基本。

答案 3 :(得分:0)

这会选择所有不同的值(s.idf.FLAG1f.FLAG1f.FLAG1组合为不同)到名为#DLK_TEMP的临时表中。它获得的数据(即s.idf.FLAG1f.FLAG1f.FLAG1)来自三个不同的表格,这些表格隐藏了唯一键(Inner_Source,{{ 1}},Outer_Source_1)。左边连接在这里提供了对连接语句左侧的值的说明。

注意,左外连接包括来自两个表的第一个(左)的所有记录,即使第二个(右)表中的记录没有匹配值。

我希望这会有所帮助。