2017-12-17 17 views
0

私は2つのテーブルを持っています.1つはマスタ、もう1つはルックアップです。どちらも鍵を持っていません。表の構造は以下の通りです。真のユニークなレコードを識別ミックスに関与する他のフィールドがあるので、キーなしでテーブルを結合すると、結果が正しくない

 first name last name role  location Compensation Level state 
     john  smith  Manager  LA   A     CA 
     john  smith  Manager  BOS  B     MA 
     super  smither developer LA   B     CA 
     tina  taylor  supervisor SFO  A     CA 
     tina  taylor  supervisor BOS  B     MA 


    first name last name role  dept   
    john   smith  manager  finance  
    john   smith  manager  hr  
    super  smither developer PA  
    tina   taylor supervisor HR  
    tina   taylor supervisor hr  

非常に当然のことながら、最初の名前のためのDEPTを取得するために2つのテーブルを結合、姓と役割の組み合わせは、間違った結果になります。

しかし、このような構造では、私は部署を取得するために2つのテーブルに参加する方法はありますか?

インラインサブクエリの使用は、最終手順の設計方法およびその他の要因によりオプションではありません。

これについてのご意見はありますか?

予想される出力:

first name last name role  location Compensation state dept 
john  smith  Manager LA   A   CA finance 
john  smith  Manager BOS   B   MA hr 
super  smither developer LA   B   CA PA 
tina  taylor  supervisor SFO   A   CA HR 
tina  taylor  supervisor BOS  B   MA HR 
+0

キーなしでこれを行うにはどうすればよいですか?どのジョン・スミスがそこにいるかは分かりません。ティナ・テイラーと同じ。 – Powerlord

+0

それは鍵そのものではなく、ロール/部門を一意に識別する手段がないということです。表2には、表1にもある弁別器が必要です。 –

+0

期待される結果の最初の行では、最初の部門が財務ではなく時間であるべきではないことをどのように知っていますか?表は定義上、順序付けられていない行セットです。 –

答えて

1

はここで確定的な結果を与える例ですが、彼らは、任意の結果です。これは単に各テーブルの「順序付けられた位置」を決定することに基づいているため、選択肢を作ることができ、その選択はクエリが実行されるたびに同じですが、選択肢が正しいかどうかを知る方法はありません。

WITH 
    sorted_t1 AS 
(
    SELECT 
     *, 
     ROW_NUMBER() OVER (PARTITION BY first_name, last_name, role 
           ORDER BY compensation_level, location, state) AS discriminator 
    FROM 
     t1 
) 
, 
    sorted_t2 AS 
(
    SELECT 
     *, 
     ROW_NUMBER() OVER (PARTITION BY first_name, last_name, role 
           ORDER BY dept) AS discriminator 
    FROM 
     t2 
) 
SELECT 
    * 
FROM 
    sorted_t1 t1 
FULL OUTER JOIN 
    sorted_t2 t2 
     ON t1.first_name = t2.first_name 
     AND t1.last_name  = t2.last_name 
     AND t1.role   = t2.role 
     AND t1.discriminator = t2.discriminator 

NOTES:

これは、 "大文字と小文字を区別しない" 照合順序を前提としています。さもなければjohn smith行は、表2中の2つのtina taylor行が'HR''hr'異なる同様

、が、照合順序は、大文字と小文字を区別しない場合には('manager'一致しない'Manager'として)に参加することはありません行と行の間に「重大な」相違がないため、どの列にどの列が結合されるかは重要ではありません。

上記の例では、LAの'John Smith'financeであると仮定する実際の理由はありません。クエリーは単にその関連付けを強制するか、またはROW_NUMBER()ORDER BYを選択したためです。これは、このテクニックを使用するときに、実際に他のフィールドを使用する必要があることを意味します。平均があります。

関連する問題