FULL OUTER JOIN,有点INNER

时间:2011-07-05 15:04:38

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

这是我面临的问题:

  • 我从客户端
  • 收到预期的X.
  • 我从公司收到了实现的X. 机构
  • 我必须完全外连接 代码上的预期和实现的X. 平等和他们一样长 同样的工作文件

例如:

Realized Xs for job file #123 : A and B
Expected Xs for job file #123 : A and C
Expected Xs for job file #456 : B

预期结果:

Job_File Realized Expected
-------- -------- --------
123      A        A
123      B        NULL
123      NULL     C
456      NULL     B

当然,123的实现 B 应该永远不会与456的预期 B 匹配,因为它们不属于同一个工作文件。

因此,就好像我想同时在代码上进行完全外连接,在内部连接上找到作业文件ID。

这看起来很奇怪但实际上......非常符合逻辑。我怎么能这样做呢?

非常感谢您的宝贵帮助! : - )

5 个答案:

答案 0 :(得分:6)

您只需加入两个条件而不是一个条件!

SELECT COALESCE(realized.Job_File, expected.Job_File), 
       realized.code, 
       expected.code
FROM realized 
    FULL OUTER JOIN expected 
        ON realized.Job_File = expected.Job_File 
        AND realized.Code = expected.Code 

答案 1 :(得分:2)

  

因此,就好像我想同时在代码上进行完全外连接,在内部连接上找到作业文件ID。

我假设你有这些表:

Jobs
  id

Realized
  id
  job_id

Expected
  id
  job_id

然后你可以完全按照你所说的去做!

SELECT j.job_id, r.id, e.id
FROM Jobs j
INNER JOIN (Realized r FULL OUTER JOIN Expected e
            ON r.job_id = e.job_id)
ON j.id = r.job_id

答案 2 :(得分:2)

完全外部联接应该可以正常工作(假设SQL Server支持它,我只使用Oracle检查):

create table realized_xs(job_file number, module varchar2(10));
create table expected_xs(job_file number, module varchar2(10));

insert into realized_xs(job_file, module) values(123, 'A');
insert into realized_xs(job_file, module) values(123, 'B');
insert into expected_xs(job_file, module) values(123, 'A');
insert into expected_xs(job_file, module) values(123, 'C');
insert into expected_xs(job_file, module) values(456, 'B');

select coalesce(r.job_file, e.job_file) job_file, 
 r.module r_module, e.module e_module
from realized_xs r 
full outer join expected_xs e on r.job_file = e.job_file and r.module = e.module

答案 3 :(得分:2)

这应该有效,因为它是你自己说的全外连接:

select
   isnull(r.JobFile, e.JobFile) as JobFile, Realized, Expected
from
   (select 123 as JobFile, 'A' as Realized
   union all
   select 123, 'B')  r

   full outer join
   (select 123 as JobFile, 'A' as Expected
   union all
   select 123, 'C'
   union all
   select 456, 'B')  e on r.JobFile = e.JobFile and r.Realized = e.Expected

   order by 1, 2

答案 4 :(得分:1)

根据问题的发布方式,您的答案都是正确的。谢谢大家,你的回答有多快! : - )

我无法轻易解释为什么在不向帖子添加太多具体业务详细信息的情况下,它无法应用于我的特定上下文。纯FULL OUTER JOIN会导致添加数十亿不需要的非匹配行。

幸运的是,一位同事发现了这个伎俩,我依次给它回复,以防有人能够认出我自己的问题,尽管我保持这种模糊不清:这个想法是(简单地)INNER JOIN实现了预期的按作业文件ID,然后按FULL OUTER再次按照代码将结果再次加入到预期中。

希望这可以帮助某人......