2016-12-20 25 views
-1

私は一意のIDに基づいて別のテーブルに結合すべきテーブルを持っています。私がしたらLEFT OUTER JOIN ON私は重複を持っています。 SELECTDISTINCTを入れれば、正しいレコード数が得られます。その後、私がLEFT OUTER JOINを行ったテーブルのフィールドを追加すると、重複が再び発生します。ここに私のクエリです:例ではSQL Left Outer Join?

SELECT DISTINCT 
Table1.fname, 
Table1.lname, 
Table2.address 
FROM Table1 
LEFT OUTER JOIN Table2 
ON Table2.user_id = Table1.userid 

私は重複を取得しています上に、また、私がやって試してみました:これは私のレコードの正しい数を与えた

LEFT OUTER JOIN (
    SELECT user_id 
    FROM Table2 
    GROUP BY user_id 
) AS t2 ON Table1.user_id = t2.user_id 

が、私はからいくつかの追加の列が必要です私が何かを逃したか、この種の問題に対処するためのより良い方法がある場合、私は思ったんだけど

LEFT OUTER JOIN (
    SELECT user_id, address 
    FROM Table2 
    GROUP BY user_id, address 
) AS t2 ON Table1.user_id = t2.user_id 

:私は、再び例を、重複を取得しています余分な列が含まれた後、第2のテーブル、。誰かが何かを見たり、より良い解決策を知っていれば私に知らせてください。

+1

表2の主キーは何ですか? –

+4

複数の値を持つため、これらの追加の列でDISTINCTから重複を取得しています。これらの列から複数の値のうちどれが望ましいか教えていただけない限り、修正する方法を教えてください。 – RBarryYoung

+1

データが表示されますか? – coderredoc

答えて

1

データを理解せずに正しい答えを選択することは不可能です。

Table2は、user_idごとに複数のaddressをサポートしているようです。これは一般的な設計です。 - 表2から重複したアドレスを削除し、再びこのような状況を防ぐ制約を追加

  1. は、データを修正:あなたは一つだけaddressuser_idあたりを返したい場合は、いくつかのオプションがあります。どのアドレスが間違っているかを判断する必要があります。
  2. ユーザーごとに1つのアドレスのみを含めるように左結合を減らします。これを行う方法は、他のデータによって異なります。倍数がどこにあるかを気にしない場合、または有効日までに注文して最新のものを取る必要がある場合は、min()またはmax()group byと一緒に使用することができます。正しいものを選ぶべきです。
  3. ユーザーあたり複数のアドレスがあることに同意します - これは正しいかもしれません - 残りのコードを調整してください。