2011-07-05 4 views
2

あるJOINを私が直面してる問題です:私はクライアント FULL OUTERはここで多少INNER

  • から期待されるXを受ける

    • は私が持ってしっかり 機関
    • から実現Xを受け取ります完全外部への期待 に参加し、AS LONGそれらが同じジョブファイルを に属しているように、コード 平等に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 
    

    期待される結果:彼らは同じジョブファイルに属していないので、もちろん123の実現B

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

    は456の予想Bと一致することはありません。

    これは、コードの外部結合とジョブファイルIDの内部結合を同時に実行したい場合と同じです。

    これは奇妙だと思われますが...実際は非常に論理的です。どのように地球上でこのようなことをすることができますか?

    大変ありがとうございます。 :-)

  • +0

    おそらくいくつかのサンプルデータを使って、すべてのテーブルの構造を貼り付けることができますか? – EdoDodo

    +0

    私たちが見ることができるあなたの本当のフォーマットのデータがありますか?元のようなものがわからないと何かを与えるのは難しい – DForck42

    答えて

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

    完全外部(私はOracleを使用してのみチェックし、SQL Serverはそれをサポートしていると仮定して)うまく動作するはずです参加:あなたが言ったように

    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

    あなたの回答は、質問がどのように掲示されたかを考慮してすべて正しいです。素早くあなたに答えてくれてありがとう! :-)

    残念ながら、あまりにも特定の状況にあまりにも具体的なビジネスの詳細を投稿せずに適用できない理由を簡単に説明できませんでした。純粋なFULL OUTER JOINは、何十億という不要な不一致の行を追加します。

    幸いにも、同僚がこのトリックを見つけました。誰かが自分の問題を私の中で認識することができるように、私はそれを保持しています。アイデアは、ジョブファイルIDによって予期され、次にFULL OUTER JOINに、今度はコードによって再び期待どおりの結果が得られます。

    これは誰かを助けることができると期待しています...

    +1

    実際にこの種の私を悩ます;あなたのビジネスの詳細がとてもプライベートで、あなたの実際の質問に答えるチャンスを与えるのに十分な情報を投稿できないようです。あなたは答えを見ているという証拠は見当たりません....だから、質問を最初に投稿することによって誰もが時間を無駄にするのはなぜですか? –

    +0

    @Chrisビジネスの詳細はプライベートではありませんが、大文字小文字を説明するのがはるかに簡単になり、さまざまな種類の問題が混在するような気がします。基本的には、すべてのジョブファイルがXを実現しており、比較的少数のユーザーだけが自分の投稿の範囲に入るXを期待しています。純粋な完全な外部結合は、実現されたすべてのXを考慮に入れます。つまり、数千の行が多すぎます。 – Ssithra

    関連する問題