将三表完全外部联接查询转换为MySQL

将三表完全外部联接查询转换为MySQL,mysql,sql,sql-server,Mysql,Sql,Sql Server,我需要将这个在SQLServer中工作的查询转换为MySQL。我已经绕着它转了至少50圈,我被难住了,甚至找不到一个起点 简而言之,问题是: 它不是一个而是两个MySQL没有的FULL-OUTER连接。我 知道这可以通过将UNION与LEFT和RIGHT联接结合使用来模拟 它在多个条件下联接表,我不知道如何添加排除 如果执行典型的右连接 实际上,您的查询并没有进行完全的外部联接,因为这样的条件: ca.state = s_uy.state 要求匹配ca.state。也就是说,外部联接将变为

我需要将这个在SQLServer中工作的查询转换为MySQL。我已经绕着它转了至少50圈,我被难住了,甚至找不到一个起点

简而言之,问题是:

  • 它不是一个而是两个MySQL没有的
    FULL-OUTER
    连接。我 知道这可以通过将
    UNION
    LEFT
    RIGHT
    联接结合使用来模拟
  • 它在多个条件下联接表,我不知道如何添加排除 如果执行典型的
    右连接

实际上,您的查询并没有进行完全的外部联接,因为这样的条件:

ca.state = s_uy.state
要求匹配
ca.state
。也就是说,外部联接将变为内部联接

因此,为了从理论上回答您的问题,最简单的方法可能是在表中使用
UNION
生成所有行,然后使用
left join

FROM (SELECT reporting_period, . . .
      FROM adhoc_work.Cash ca
      UNION   -- on purpose to remove duplicates
      SELECT reporting_period, . . .
      FROM adhoc_work.Summary_placed
      UNION   -- on purpose to remove duplicates
      SELECT reporting_period, . . .
      FROM adhoc_work.Summary_uy
     ) x LEFT JOIN
     adhoc_work.Cash ca
     ON x.reporting_period = ca.reporting_period AND
        . . . LEFT JOIN
     adhoc_work.Summary_placed s_p
     ON x.reporting_period = s_p.reporting_period AND
        . . . LEFT JOIN
     adhoc_work.Summary_uy s_uy
     ON x.reporting_period = s_uy.reporting_period AND
        . . .

实际上,您的查询并没有进行完全的外部联接,因为这样的条件:

ca.state = s_uy.state
要求匹配
ca.state
。也就是说,外部联接将变为内部联接

因此,为了从理论上回答您的问题,最简单的方法可能是在表中使用
UNION
生成所有行,然后使用
left join

FROM (SELECT reporting_period, . . .
      FROM adhoc_work.Cash ca
      UNION   -- on purpose to remove duplicates
      SELECT reporting_period, . . .
      FROM adhoc_work.Summary_placed
      UNION   -- on purpose to remove duplicates
      SELECT reporting_period, . . .
      FROM adhoc_work.Summary_uy
     ) x LEFT JOIN
     adhoc_work.Cash ca
     ON x.reporting_period = ca.reporting_period AND
        . . . LEFT JOIN
     adhoc_work.Summary_placed s_p
     ON x.reporting_period = s_p.reporting_period AND
        . . . LEFT JOIN
     adhoc_work.Summary_uy s_uy
     ON x.reporting_period = s_uy.reporting_period AND
        . . .

我试着沿着你建议的路走。一个障碍是,您建议的
联合
s要求
联合
部分中的所有字段都相同。正如您在原始查询中所看到的,前五个左右的字段是相同的,但在这之后,它们会出现分歧。根据您的观察,原始查询并不是真正的
完全外部联接
。我已经开始尝试让它们
LEFT JOIN
s,我得到了一个右键但不同的答案,其中我的MySQL几乎是SQL Server答案的一个完整子集。这就是我现在的处境。在这件事上我有点不知所措。我已经试着走你建议的路了。一个障碍是,您建议的
联合
s要求
联合
部分中的所有字段都相同。正如您在原始查询中所看到的,前五个左右的字段是相同的,但在这之后,它们会出现分歧。根据您的观察,原始查询并不是真正的
完全外部联接
。我已经开始尝试让它们
LEFT JOIN
s,我得到了一个右键但不同的答案,其中我的MySQL几乎是SQL Server答案的一个完整子集。这就是我现在的处境。在这件事上我有点不知所措。