INNER JOIN ve LEFT SEMI JOIN arasındaki fark


85

Ve INNER JOINve arasındaki fark nedir LEFT SEMI JOIN?

Aşağıdaki senaryoda neden iki farklı sonuç alıyorum?

INNER JOINSonuç kümesi çok büyüktür. Biri açıklayabilir mi? İçinde table_1sadece görünen isimleri almaya çalışıyorum table_2.

SELECT name
FROM table_1 a
    INNER JOIN table_2 b ON a.name=b.name

SELECT name
FROM table_1 a
    LEFT SEMI JOIN table_2 b ON (a.name=b.name)

2
İç birleşim hedefinize ulaşacaktır. Bu soruyu görene kadar hiç yarı birleştirme duymamıştım.
Dan Bracuk

left semi joinDaha fazla satır iade edilmelidir inner join.
Gordon Linoff

1
inner joinHer iki tablo arasında bir eşleşme olması halinde verileri döndürür. left joinEşleşen bir rekor ikinci tabloda görüldüğü takdirde bakılmaksızın birinci tablodan verileri döndürür.
j03z

11
@GordonLinoff LEFT SEMI JOIN, sağda birden fazla eşleşme olsa bile soldan yalnızca bir satır döndürür. Bir INNER JOINsağda çoklu eşleştirme varsa birden çok satır döndürür.
D Stanley

1
@ j03z bu doğru olamaz. Sol hemi-birleştirmenin amacı 1) yalnızca sol tablodaki bilgileri (diğerlerinin söylediği gibi) döndürmek ve 2) eşleşmeden bağımsız olarak soldaki tablodan satırları döndürmekse (sizin de söylediğin gibi) o zaman bu sadece orijinal sol tablo - bunu başarmak için bir birleştirme gerekli değildir. Diğerlerinin doğru olması gerektiğini düşünüyorum, sol hemi-join 1) yalnızca soldaki tablodan sütunlar döndürür, 2) yalnızca sağ tabloda eşleşen satırları döndürür ve 3) soldan tek bir satır döndürür veya daha fazla eşleşme.
Carl G

Yanıtlar:


126

Her INNER JOINiki tablodaki sütunlardan veri döndürebilir ve her iki tarafta birden fazla eşleşmeye sahip kayıtların değerlerini yineleyebilir. A LEFT SEMI JOIN, yalnızca sol taraftaki tablodan sütunlar döndürebilir ve sağ taraftaki tabloda bir veya daha fazla eşleşme olan (eşleşme sayısına bakılmaksızın) sol taraftaki tablodan her kayıttan birini verir. Eşittir (standart SQL'de):

SELECT name
FROM table_1 a
WHERE EXISTS(
    SELECT * FROM table_2 b WHERE (a.name=b.name))

Sağdaki sütunda birden fazla eşleşen satır varsa , sağ taraftaki eşleşen satırların sayısına bakılmaksızın yalnızca soldaki tablodaki satırları döndürürken, INNER JOINsağdaki tablodaki her eşleşme için bir satır LEFT SEMI JOINdöndürür. Bu nedenle, sonucunuzda farklı sayıda satır görüyorsunuz.

Yalnızca table_2'de görünen table_1 içindeki adları almaya çalışıyorum.

Daha sonra LEFT SEMI JOINkullanılacak uygun sorgu a'dır.


Gerçekten böyle bir şey var mı LEFT SEMI JOIN? Değil SEMI JOINmi? Bir anlamı yok RIGHT SEMI JOIN, değil mi?
ErikE

In Kovanı , evet.
D Stanley

1
aradığım harika bir cevap. cevabı daha doğru ifade ederdim: "... bir INNER JOIN , sağ tablonun eşleşen her satırı için bir satır döndürecektir , LEFT SEMI JOIN ...
Barak1731475

2
Bunun tersi, sol tablodaki sağ tablodaki verileri bir anahtara göre filtreleyen bir LEFT ANTI JOIN'dir. Bakıyor olabilecek biri için bu külçeyi burada bırakayım dedim!
shantanusinghal

64

Yalnızca 2 sütun (Id, Data) ve aşağıdaki veriler içeren 2 tablo TableA ve TableB olduğunu varsayalım:

TabloA:

+----+---------+
| Id |  Data   |
+----+---------+
|  1 | DataA11 |
|  1 | DataA12 |
|  1 | DataA13 |
|  2 | DataA21 |
|  3 | DataA31 |
+----+---------+

TableB:

+----+---------+
| Id |  Data   |
+----+---------+
|  1 | DataB11 |
|  2 | DataB21 |
|  2 | DataB22 |
|  2 | DataB23 |
|  4 | DataB41 |
+----+---------+

Sütunda İç Birleştirme , Idhem tablodan hem de yalnızca eşleşen kayıtlardan sütunları döndürür:

.----.---------.----.---------.
| Id |  Data   | Id |  Data   |
:----+---------+----+---------:
|  1 | DataA11 |  1 | DataB11 |
:----+---------+----+---------:
|  1 | DataA12 |  1 | DataB11 |
:----+---------+----+---------:
|  1 | DataA13 |  1 | DataB11 |
:----+---------+----+---------:
|  2 | DataA21 |  2 | DataB21 |
:----+---------+----+---------:
|  2 | DataA21 |  2 | DataB22 |
:----+---------+----+---------:
|  2 | DataA21 |  2 | DataB23 |
'----'---------'----'---------'

Sütundaki Sol Birleştirme (veya Sol Dış birleşim), Idhem tablodan hem de soldaki tablodaki kayıtlarla eşleşen kayıtları (sağ tablodan boş değerler) döndürür:

.----.---------.----.---------.
| Id |  Data   | Id |  Data   |
:----+---------+----+---------:
|  1 | DataA11 |  1 | DataB11 |
:----+---------+----+---------:
|  1 | DataA12 |  1 | DataB11 |
:----+---------+----+---------:
|  1 | DataA13 |  1 | DataB11 |
:----+---------+----+---------:
|  2 | DataA21 |  2 | DataB21 |
:----+---------+----+---------:
|  2 | DataA21 |  2 | DataB22 |
:----+---------+----+---------:
|  2 | DataA21 |  2 | DataB23 |
:----+---------+----+---------:
|  3 | DataA31 |    |         |
'----'---------'----'---------'

Sütundaki Sağ Birleştirme (veya Sağ Dış birleşim), Idher iki tablodan sütunları ve sağ tablodaki kayıtlarla eşleşen kayıtları (soldaki tablodan boş değerler) döndürür:

┌────┬─────────┬────┬─────────┐
│ Id │  Data   │ Id │  Data   │
├────┼─────────┼────┼─────────┤
│  1 │ DataA11 │  1 │ DataB11 │
│  1 │ DataA12 │  1 │ DataB11 │
│  1 │ DataA13 │  1 │ DataB11 │
│  2 │ DataA21 │  2 │ DataB21 │
│  2 │ DataA21 │  2 │ DataB22 │
│  2 │ DataA21 │  2 │ DataB23 │
│    │         │  4 │ DataB41 │
└────┴─────────┴────┴─────────┘

Sütunda Tam Dış Birleştirme , Idhem tablodan hem de soldaki tablodaki kayıtlarla eşleşen kayıtları (sağ tablodan boş değerler) ve sağ tablodaki kayıtları (soldaki tablodan boş değerler) döndürür:

╔════╦═════════╦════╦═════════╗
║ Id ║  Data   ║ Id ║  Data   ║
╠════╬═════════╬════╬═════════╣
║  - ║         ║    ║         ║
║  1 ║ DataA11 ║  1 ║ DataB11 ║
║  1 ║ DataA12 ║  1 ║ DataB11 ║
║  1 ║ DataA13 ║  1 ║ DataB11 ║
║  2 ║ DataA21 ║  2 ║ DataB21 ║
║  2 ║ DataA21 ║  2 ║ DataB22 ║
║  2 ║ DataA21 ║  2 ║ DataB23 ║
║  3 ║ DataA31 ║    ║         ║
║    ║         ║  4 ║ DataB41 ║
╚════╩═════════╩════╩═════════╝

Sütunda Sol Yarı Birleştirme , Idyalnızca sol tablodaki sütunları ve yalnızca sol tablodaki eşleşen kayıtları döndürür:

┌────┬─────────┐
│ Id │  Data   │
├────┼─────────┤
│  1 │ DataA11 │
│  1 │ DataA12 │
│  1 │ DataA13 │
│  2 │ DataA21 │
└────┴─────────┘

Ben buna "SOL İÇ Birleştirme" derdim.
Anshul Joshi

INNER JOIN sonucundan gelen DISTINCT, LEFT SEMI JOIN ile eşdeğerdir.
Teja

4
Farklı görünmüyor, A'nın iki özdeş kayıt içerdiğini varsayalım.
Dennis Jaheruddin

Sonuç aynı olsa bile, DISTINCT kullanmak
EXISTS'e

32

Hive'da denendi ve aşağıdaki çıktıyı aldı

tablo 1

1, wqe, chennai, Hindistan

2, stu, salem, hindistan

3, mia, bangalore, hindistan

4, yepie, newyork, ABD

Tablo 2

1, wqe, chennai, Hindistan

2, stu, salem, hindistan

3, mia, bangalore, hindistan

5, chapie, Los angels, ABD

İç birleşim

SELECT * from table1 INNER JOIN table2 ON (table1.id = table2.id);

1 wqe chennai hindistan 1 wqe chennai hindistan

2 stu salem hindistan 2 stu salem hindistan

3 mia bangalore hindistan 3 mia bangalore hindistan

Sol yönden katılım

Tablo1'den SEÇ * TABLO2'Nİ SOL BİRLEŞTİRİN (tablo1.id = tablo2.id);

1 wqe chennai hindistan 1 wqe chennai hindistan

2 stu salem hindistan 2 stu salem hindistan

3 mia bangalore hindistan 3 mia bangalore hindistan

4 yepie newyork USA NULL NULL NULL NULL

Sol Yarı Birleşim

Tablo1'DEN SEÇİM * LEFT SEMI JOIN table2 ON (table1.id = table2.id);

1 wqe chennai hindistan

2 stu Salem Hindistan

3 Mia Bangalore Hindistan

not: Yalnızca sol tablodaki kayıtlar görüntülenirken, Sol Birleştirme için her iki tablo kaydı görüntülenir


0

Daha iyi anlamak için venn diyagramları ile tasvir etmeye çalışmak ..

Sol yarı birleştirme: yarı arasından döner değerleri birleştirme sol tarafında ilişkinin bir eşleşme sahip olan sağ . Sol yarı birleştirme olarak da adlandırılır.

görüntü açıklamasını buraya girin

Not: denilen sol karşıtı katılmak başka bir şey yoktur: Bir anti gelen döner değerleri katılmak sol ilişki eşleşme vardır sağ ile . Aynı zamanda sol anti birleşim olarak da adlandırılır.

İç birleşim : Her iki ilişkide de eşleşen değerlere sahip satırları seçer.

görüntü açıklamasını buraya girin

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.