2

这是我面临的问题:

  • 我从客户那里收到了预期的 Xs
  • 我从公司代理处收到了已实现的 X
  • 只要它们属于同一个作业文件,我就必须完全外部加入预期和实现的代码平等 Xs

例如 :

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 进行内连接。

这看起来很奇怪,但……实际上非常合乎逻辑。我到底怎么能做这种事???

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

4

5 回答 5

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 
于 2011-07-05T15:10:25.053 回答
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
于 2011-07-05T15:10:51.120 回答
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
于 2011-07-05T15:13:39.233 回答
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
于 2011-07-05T15:13:48.857 回答
1

鉴于发布问题的方式,您的答案都是正确的。谢谢大家这么快的回答!:-)

我无法轻易解释为什么如果不向帖子中添加太多具体的业务细节,它就不能适用于我的特定环境。纯粹的 FULL OUTER JOIN 会导致添加数十亿不需要的不匹配行。

幸运的是,一位同事找到了诀窍,我反过来把它还给了它,以防有人能认识到我自己的问题,尽管我保持它的含糊不清:这个想法(简单地)是在预期的工作文件上实现 INNER JOIN id 然后将结果再次完全连接到预期的结果,这次是通过代码。

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

于 2011-07-05T15:25:37.507 回答