2012-08-06 66 views
1

我想知道如果有人能帮我理解这段代码在做什么。我插入了一个SQL脚本,我试图更新代码,以便阅读。我已经看过下面的代码,它似乎有一个更简单的方法来做到这一点,但我不能把我的头围绕着这个代码实际上在做什么。任何人都可以帮我描述一下这段代码吗? (也许给我介绍到如何使用子查询或存在,或读这更简单的方法做到这一点?令人困惑的SQL Server代码

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 
+1

它工作吗?是?不要碰它然后 – podiluska 2012-08-06 13:44:57

+0

他想明白它在做什么。 – MoonKnight 2012-08-06 13:48:22

+2

WHERE S.id'在WHERE子句中没有任何意义。这会将您的第一个外部联接转换为内部联接。 – 2012-08-06 13:49:46

回答

2

似乎很奇怪,它的上S执行LEFT OUTER JOIN,然后那些联接成功行测试。这应该是一个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 
) 
+0

由于您正在重构它,不妨删除三重'FLAG1'字段。 – Blindy 2012-08-06 13:49:06

+0

你们真棒。我只是无法包裹我的头围绕着2个外部连接,没有任何列正被内部连接到... 非常感谢Mark! – DaveKelley 2012-08-06 14:14:59

0
INTO #DLK_TEMP 

是要插入一个双激动人心的临时表(当连接被关闭破坏)外连接成。

0

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

至于什么特别呢,它加入Inner_SourceOuter_Source_1Outer_Source_2(外专连接,这意味着你即使加入字段在某些表缺少的行(虽然第一次参加是相当多的内连接..))并从结果数据集中插入几个字段到临时表#DLK_TEMP

您应该阅读连接,因为它们是数据库设计和编程的主要组件。你的这个问题真的很基本。

0

这是选择所有不同的值(s.idf.FLAG1f.FLAG1f.FLAG1组合是不同的)到一个临时表称为#DLK_TEMP。它正在获得的数据(即s.id,f.FLAG1,f.FLAG1,f.FLAG1)来自三个不同的表格,这些表格包含唯一密钥(Inner_Source,Outer_Source_1,Outer_Source_2)。这里的左连接提供了对连接语句左侧的值的优先顺序。

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

我希望这会有所帮助。