2

ここに私が直面している問題があります:

  • クライアントから期待される X を受け取る
  • 私は、会社の代理店から実現された 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 の内部結合を同時に実行したいということです。

それは奇妙に思えますが... 実際、非常に論理的です。いったいどうやってそんなことができるの???

貴重なご協力ありがとうございました。:-)

4

5 に答える 5

6

1つではなく2つの条件で参加するだけです!

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

完全な外部結合は問題なく動作するはずです (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 に答える
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 に答える
1

質問が投稿された方法を考えると、あなたの答えはすべて正しいです。迅速に回答していただきありがとうございます。:-)

残念ながら、特定のビジネスの詳細を投稿に追加しなければ、私の特定のコンテキストに適用できない理由を簡単に説明することはできませんでした. 純粋な FULL OUTER JOIN では、数十億の不要な一致しない行が追加されます。

幸いなことに、同僚がトリックを見つけました。私がそれをどれほど漠然としていても、誰かが私の問題を認識できる場合に備えて、私はそれを返します。 id を FULL OUTER JOIN して、今度はコードで期待どおりの結果をもう一度取得します。

これが誰かを助けることを願っています...

于 2011-07-05T15:25:37.507 に答える