Sql 完全外连接值条件
我需要为完全外部联接添加值条件 也就是说,我很乐意这样做: 挑选* 来自表1 表1.Field1上的完全外部联接表2=表2.Field1和表2.Field2>5 但是这个脚本不起作用。实际上,看起来Table2.Field2>5的条件根本没有应用过 右外部联接也会出现同样的问题,因此我认为原因是,当存在右联接或完全联接时,没有值条件应用于联接中的右表。 为什么会这样?对这种行为有概念上的解释吗 当然,主要问题是如何解决这个问题 有没有一种不用子查询就能解决这个问题的方法 挑选* 来自表1 完全外部联接从表2中选择*,其中表2.Field2>5为表1.Field1=t2.Field1上的t2Sql 完全外连接值条件,sql,join,outer-join,full-outer-join,Sql,Join,Outer Join,Full Outer Join,我需要为完全外部联接添加值条件 也就是说,我很乐意这样做: 挑选* 来自表1 表1.Field1上的完全外部联接表2=表2.Field1和表2.Field2>5 但是这个脚本不起作用。实际上,看起来Table2.Field2>5的条件根本没有应用过 右外部联接也会出现同样的问题,因此我认为原因是,当存在右联接或完全联接时,没有值条件应用于联接中的右表。 为什么会这样?对这种行为有概念上的解释吗 当然,主要问题是如何解决这个问题 有没有一种不用子查询就能解决这个问题的方法 挑选* 来自表1 完全外
您想要的内容可以重新表述为:
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
但是按照你自己的建议使用子查询是最好的选择。非常令人信服,但没有子查询
测试脚本
结果
这让我很困惑。现在我明白了! 在您的案例中,启用后的条件是:Table1.Field1=Table2.Field1和Table2.Field2>5告诉联接运算符两个表中的哪些行被联接。这意味着当且仅当表1中的行1和表中的行2同时满足row1.field1=row2.field2和row2.field2>5时,行1和行2才会合并。其余行未连接 因此,在完全外部联接中,结果集将是联接行、表1中的未联接行和表2中的未联接行。 在右连接中,结果集将是表2中的连接行和非连接行。
不管是哪种情况,表2中带field2的行都感谢您的建议,但这对我来说不是一个好的解决方案。你说得对,但这比简单的子查询更复杂。@SergeyT:你问的时候没有子查询,我回答的时候没有子查询。您的解决方案可能是最好的选择。根据RDBMS的不同,您可以将其包含在WITH子句中。谢谢,但这仍然不是我想要的解决方案。虽然这种方法保存了对我来说至关重要的查询结构,因为SQL语句是自动生成的,所以它比以前的解决方案更合适。还有很多额外的代码,所以也许我最终不得不实现子查询解决方案。但这个解决方案已经足够好了,所以我想我可以接受它作为答案。
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