2011-07-05 43 views
2

這裏是我現在面臨的問題:FULL OUTER JOIN這是有點INNER

  • 我收到預期的兩個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的預期匹配,因爲它們不屬於同一個作業文件。

所以,就好像我想要在代碼和內部連接上同時完成外部連接的工作文件ID。

這似乎很奇怪,但......非常合乎邏輯,實際上。我究竟可以做這樣的事情?

非常感謝您的寶貴幫助! :-)

+0

你可以粘貼所有表的結構,也許與一些示例數據? – EdoDodo

+0

你有你的真實格式的數據,我們可以看看嗎?如果我們不知道原來的樣子是什麼,很難給你一些東西 – DForck42

回答

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 
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

完全外部連接應該只是罰款(假設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 
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 
1

你給出的問題發佈的答案都是正確的。謝謝大家,你回答得有多快! :-)

我不能很容易地解釋爲什麼不幸的是,它不能適用於我的具體情況,而無需在帖子中添加太多具體的商業細節。純粹的全外連接會導致增加數十億不需要的不匹配行。

幸運的是,一位同事找到了這個竅門,我反過來又回過頭來,以防萬一有人能認出我自己的問題,儘管我保持模糊:這個想法(簡單地說)是INNER JOIN預期按工作文件編號,然後再用FULL OUTER JOIN將結果重新編入預期的次數,這次是通過代碼。

希望這可以幫助別人......

+1

其實這種惹惱了我;這聽起來像你的商業細節是如此的私人,你不能發佈足夠的信息,甚至給我們一個機會來回答你的實際問題。我沒有看到證據顯示你甚至看到了答案......所以爲什麼要把每個人的時間都放在首位呢? –

+0

@Chris商業細節不是私密的,但我覺得描述案例並不容易,並會混合不同類型的問題。基本上,所有的工作文件都已經實現了X,只有相對較少的人也期望X能夠進入我的文章範圍。純粹的完全外連接會考慮到所有已實現的X,即成千上萬行太多。 – Ssithra