令人困惑的SQL Server代码

令人困惑的SQL Server代码,sql,sql-server,Sql,Sql Server,我想知道是否有人能帮我理解这段代码在做什么。我已经内置了一个SQL脚本,我正在尝试更新代码,以便更容易阅读。我已经看过了下面的代码,似乎有一种更简单的方法可以做到这一点,但我无法理解这段代码实际上在做什么。谁能帮我描述一下这个代码吗?(也许能告诉我如何使用子查询、EXISTS或更简单的阅读方法来实现这一点 SELECT DISTINCT s.id ,f.FLAG1 ,f.FLAG1 ,f.FLAG1 INTO #DLK_TEMP from Inner_Source

我想知道是否有人能帮我理解这段代码在做什么。我已经内置了一个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 

是一个临时表(连接关闭时会被销毁)您正在向中插入一个双重激励的外部联接。

似乎很奇怪,它在
s
上执行
左外部联接
,然后测试联接成功的行。它应该是一个
内部联接
。如果
s.ID
不可为空,则还可以删除
where
c劳斯

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
)

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

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


您应该仔细阅读连接,因为它们是数据库设计和编程的主要部分。您的查询非常基本。

这是选择所有不同的值(
s.id
f.FLAG1
f.FLAG1
f.FLAG1
组合为不同)它所获得的数据(即
s.id
f.FLAG1
f.FLAG1
f.FLAG1
f.FLAG1
)来自三个具有唯一键的不同表(
内部源代码
外部源代码
)。此处的左连接为join语句左侧的值提供了存在相关性

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


我希望这能有所帮助。

它能工作吗?是的?不要碰它,他想了解它在做什么。
WHERE S.id
WHERE
子句中没有意义。这会将第一个外部联接变成内部联接。您有意选择同一字段三次吗?顺便说一句,不。标志1应该是1-3。基本上,我是在显示没有使用来自内部源表的任何内容,以防万一这很重要。如果这给每个人都带来了困惑,很抱歉,但是你找到了我想要的答案。现在我可以描述这实际上在做什么了。:)因为你正在重构它,不妨删除三重
FLAG1
字段。你们真是太棒了。我只是不能在表中没有被内部连接到的列的情况下对2个外部连接进行思考。。。。非常感谢马克!
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
)