我需要为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
答案 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”在左连接中正常工作但在右连接或完全连接中没有“正确”工作的原因,但值条件确实正在正常工作。