这是我面临的问题:
例如:
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。
这看起来很奇怪但实际上......非常符合逻辑。我怎么能这样做呢?
非常感谢您的宝贵帮助! : - )
答案 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再次按照代码将结果再次加入到预期中。
希望这可以帮助某人......