Sql 完全外连接值条件

Sql 完全外连接值条件,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 完全外

我需要为完全外部联接添加值条件

也就是说,我很乐意这样做:

挑选* 来自表1 表1.Field1上的完全外部联接表2=表2.Field1和表2.Field2>5 但是这个脚本不起作用。实际上,看起来Table2.Field2>5的条件根本没有应用过

右外部联接也会出现同样的问题,因此我认为原因是,当存在右联接或完全联接时,没有值条件应用于联接中的右表。 为什么会这样?对这种行为有概念上的解释吗

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

有没有一种不用子查询就能解决这个问题的方法

挑选* 来自表1 完全外部联接从表2中选择*,其中表2.Field2>5为表1.Field1=t2.Field1上的t2
您想要的内容可以重新表述为:

 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