1

我想知道是否有人可以帮助我理解这段代码在做什么。我继承了一个 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

4 回答 4

2

它正在执行一个LEFT OUTER JOINonS然后测试连接成功的那些行,这似乎很奇怪。它应该是一个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
)
于 2012-08-06T13:43:32.747 回答
0
INTO #DLK_TEMP

是一个临时表(在连接关闭时被销毁),您将在其中插入一个双重令人兴奋的外连接。

于 2012-08-06T13:43:25.243 回答
0

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

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

您应该阅读连接,因为它们是数据库设计和编程的主要内容。你的那个查询真的很基础。

于 2012-08-06T13:46:55.797 回答
0

这是将所有不同的值(s.id, f.FLAG1, f.FLAG1,f.FLAG1组合为不同的)选择到一个名为 的临时表中#DLK_TEMP。它获取的数据(即s.id, f.FLAG1, f.FLAG1f.FLAG1来自三个不同的表,这些表具有唯一键(Inner_Source, Outer_Source_1, Outer_Source_2)。此处的左连接提供了连接语句左侧的值。

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

我希望这有帮助。

于 2012-08-06T13:47:31.387 回答