我想知道是否有人可以帮我理解这段代码的作用。我已经内置了一个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
答案 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_Source
与Outer_Source_1
和Outer_Source_2
连接在一起(特别是外连接,即使某些表中缺少连接字段,也意味着你会得到行(尽管第一个连接几乎是一个内连接..))并将结果数据集中的几个字段插入临时表#DLK_TEMP
。
您应该阅读联接,因为它们是数据库设计和编程的主要内容。你的查询非常基本。
答案 3 :(得分:0)
这会选择所有不同的值(s.id
,f.FLAG1
,f.FLAG1
,f.FLAG1
组合为不同)到名为#DLK_TEMP
的临时表中。它获得的数据(即s.id
,f.FLAG1
,f.FLAG1
,f.FLAG1
)来自三个不同的表格,这些表格隐藏了唯一键(Inner_Source
,{{ 1}},Outer_Source_1
)。左边连接在这里提供了对连接语句左侧的值的说明。
注意,左外连接包括来自两个表的第一个(左)的所有记录,即使第二个(右)表中的记录没有匹配值。
我希望这会有所帮助。