FULL OUTER JOIN值条件

时间:2012-01-18 08:57:58

标签: sql join outer-join full-outer-join

我需要为FULL OUTER JOIN添加值条件。

即。我很想做到这一点:

SELECT *
FROM Table1
FULL OUTER JOIN Table2 ON Table1.Field1 = Table2.Field1 AND Table2.Field2 > 5

但是这个脚本不起作用。实际上看起来条件(Table2.Field2> 5)从未应用过。

RIGHT OUTER JOIN出现同样的问题,所以我认为原因是当RIGHT或FULL加入时,没有值条件应用于连接中的右表。
为什么会这样?是否有这种行为的概念性解释?

当然,主要问题是如何解决这个问题。

有没有办法在不使用子查询的情况下解决这个问题?

SELECT *
FROM Table1
FULL OUTER JOIN (SELECT * FROM Table2 WHERE Table2.Field2 > 5) AS t2 ON Table1.Field1 = t2.Field1

3 个答案:

答案 0 :(得分:3)

你想要的可能被重新表述为:

 SELECT *
   FROM Table1
   LEFT JOIN Table2 ON Table1.Field1 = Table2.Field1 AND Table2.Field2 > 5
  UNION ALL
 SELECT *
   FROM Table1
  RIGHT JOIN Table2 ON Table1.Field1 = Table2.Field1
  WHERE Table2.Field2 > 5
    AND Table1.Field1 IS NULL

但使用自己建议的子查询是IMO最好的选择。

答案 1 :(得分:1)

相当精确但没有子查询

SELECT  Table1.*
        , CASE WHEN Table2.Field2 > 5 THEN Table2.Field1 ELSE NULL END
        , CASE WHEN Table2.Field2 > 5 THEN Table2.Field2 ELSE NULL END        
FROM    Table1
        FULL OUTER JOIN Table2 ON Table1.Field1 = Table2.Field1
WHERE   COALESCE(Table2.Field2, 6) > 5
        OR Table1.Field1 = Table2.Field1

测试脚本

;WITH Table1 AS (
  SELECT * FROM (VALUES
    (1, 1)
    , (2, 2)
    , (5, 5)
    , (6, 6)
  ) AS Table1 (Field1, Field2)
)
, Table2 AS (
  SELECT * FROM (VALUES
    (1, 1)
    , (3, 3)
    , (4, 4)
    , (5, 5)
    , (7, 7)
  ) AS Table2 (Field1, Field2)
)
SELECT  Table1.*
        , CASE WHEN Table2.Field2 > 5 THEN Table2.Field1 ELSE NULL END
        , CASE WHEN Table2.Field2 > 5 THEN Table2.Field2 ELSE NULL END        
FROM    Table1
        FULL OUTER JOIN Table2 ON Table1.Field1 = Table2.Field1
WHERE   COALESCE(Table2.Field2, 6) > 5
        OR Table1.Field1 = Table2.Field1

<强>结果

 Field1 Field2 Field1 Field2
 1      1      NULL   NULL
 5      5      NULL   NULL
 NULL   NULL   7      7
 6      6      NULL   NULL
 1      1      NULL   NULL
 2      2      NULL   NULL

答案 2 :(得分:0)

这曾经让我困惑。现在我懂了! “on”之后的条件(在您的情况下:Table1.Field1 = Table2.Field1 AND Table2.Field2&gt; 5)告诉连接运算符连接两个表中的哪些行。这意味着当且仅当来自table1的row1和来自table的row2同时满足row1.field1 = row2.field2和row2.field2&gt; 5,row1和row2连接在一起。其余的行没有连接。

因此,在完全外部联接中,结果集将连接到table1中的行,非连接行和table2中的非连接行。 在右连接中,结果集将连接来自table2的行,非连接行。 在任何一种情况下,表2中具有field2&lt; = 5的行都将是table2中未连接行的结果集。

这就是为什么“Table2.Field2&gt; 5”在左连接中正常工作但在右连接或完全连接中没有“正确”工作的原因,但值条件确实正在正常工作。