2017-02-24 21 views
0

を持つ2つのテーブルを私は次の列とデータを持つ2つの単純なテーブルがあることと言うことができます:左は参加 - 同じデータ

Table 1    Table 2 

year month   year month 
2017 01    2017 01 
2016 12    2016 12 

を主キーは今年で構成複合キーと月です。

古典的な左結合は、左のテーブルのすべてのデータに、右のテーブルの一致する行を与えます。私は左を行う場合

は次のように参加:

select 
t1.year, t2.month 

from 
table1 t1 
    left join table 2 t2 on (t1.year = t2.year and t1.month = t2.month) 

は、なぜ私は2つだけの行を得るのですか?私は4行を得てはいけないのですか?

TNX、 トム

+0

't1'には' god'カラムがありません。 –

+2

2行を取得する必要があります。't1'に' t2'の2つの行と正確に一致する2つの行があります。あなたの予想されるアウトプットは、あなたが4レコードを取得する場所です。おそらく、LEFT OUTER JOINはデカルト積を得るクロスジョイントと混同されているでしょうか? – JNevill

+0

私は少し混乱しています、クエリは、2番目のテーブルの最初のテーブルの主キーに一致するすべての行を見つけるべきではないですか?左結合は常に表1のすべてのデータを表示するため、表2のデータは(同じであっても)破棄されます。 Tom –

答えて

2

古典左はあなたに「左表」の行数を与える参加「右表」で一致の数を乗じた(からの1)(1この場合はLEFT JOIN)、LEFTテーブルのすべての行に最初のテーブルに一致するものがありません。

  • = 0

2×1 +マッチwithouth左テーブル内の行数左テーブル内の行=右テーブルでマッチの2

  • 数= 1
  • 数0 = 2

  • 編集:実際には、各行に対して乗算が行われます。合計(row_i X matches_i)+不一致

    row_i各行手段であり、第1表のI行の一致にmatches_i

    ようなものであろう。これとの違いは、各行これはもたらす

    マッチの異なる数(前の式は、あなたの場合に適合される)を有することができることである

    1(ROW1)行1のための1(マッチをxは)+ 1(ROW2)X 1(行2)を表1に+ 0(不一致行)= 0 =

    1 + 1 = 2 =は

    をもたらす結果+

    1×1 + 1×1の結果をマッチ

    4行が必要な場合は、デカルト積を取得したかったでしょう。コメントが記載されているので、その場合はクロス結合を使用できます

    +0

    結論は正しいが、説明ではない。 2番目のテーブルの両方の行が一致します。右の表の一致数は2です。 –

    +0

    説明を更新しました。とにかく、2番目のテーブルには、比類のない行があるとは言わなかった。 –

    0

    両方の列には2つの行があり、正確にsamとその複合キーに一致します。 それぞれに4つの行があって合計で4つの行しか得られない場合は、同じ方法で行います。

    0

    左結合は、Table1(t1)を左のテーブルとして受け取ります。 右からすべての値を検索して検索します。 - 基準T1.Year &月= T2.Year &月(エイリアスGOD /秒)および追加の結合条件T1.Monthに一致する表2(t2) = T2.Month。その結果、T1からの2行だけがジョイン基準と追加のジョイン基準に一致します。

    もう1つの引き継ぎ:複合ジョイントキーが注意を払うため、左ジョインのAND T1.Month = T2.Month条件は冗長です明示的に

    Results of the Left Join

    2

    あなたが一緒にテーブルを結合するときは、基本的に2つの異なるテーブルからデータを結合し、単一のレコードとして表示するようにデータベースを求めています。あなたがleft joinを実行すると、あなたが言っている:(存在する場合)

    は私にすべての表1からの行だけでなく、 表2から任意の関連するデータを与えます。この意味で

    、表2からのデータが(それらが別のテーブルに別のレコードとして保存されていても)表1に別個又は追加レコードを表していない、それは関連データを表します。各テーブルの行を追加するのではなく、テーブル間でデータをリンクしています。

    テーブル1に格納されている人とテーブル2に電話番号が格納されているとします。

      Table1       Table2 
    +------+-------+--------+   +------+-------+-------------+ 
    | Year | Month | Person |   | Year | Month | Phone  | 
    +------+-------+--------+   +------+-------+-------------+ 
    | 2017 | 12 | Bob |   | 2017 | 12 | 555-123-4567| 
    | 2016 | 01 | Frank |   | 2016 | 01 | 555-234-5678| 
    +------+-------+-------+   +------+-------+--------------+ 
    

    人とその対応する電話番号のリストを取得するために一緒に参加できます。しかし、各テーブル(2列の人と2列の電話番号)から行を組み合わせることは期待できません。

    0

    cross joinは、各引数から1行を結合することによって作成できるすべての行を返します。 (innerjoin onは、条件を満たすcross joinから行を戻します。つまり、(innerjoin onは、各引数から行を結合し、その条件を満たすすべての行を返します。

    left join onは(innerjoin onプラスあなたが右の引数の列に対してnullにより未接合左引数の行を拡張することによって行うことができます行から行を返します。

    プライマリキー、一意の列セット、外部キーまたはその他の制約にかかわらず、です。

    ここでは、各引数に2つの行があるため、cross joinには2つのX 2 = 4行があります。しかし、2つしか条件を満たすことはできません。

    left joinの場合は、条件が左右のバージョンの1つ以上の等式の結合であり、これらの列にnullが存在しない場合、すべての左引数行はで結合されます。 ()join onの行だけが返されます)

    関連する問題