cari

Rumah  >  Soal Jawab  >  teks badan

Bagaimana untuk melakukan FULL OUTER JOIN dalam MySQL?

<p>Saya mahu melakukan <em>sambungan luar penuh</em> adakah mungkin? Adakah MySQL menyokong <em>sambungan luar penuh</em>? </p>
P粉930534280P粉930534280537 hari yang lalu569

membalas semua(2)saya akan balas

  • P粉022723606

    P粉0227236062023-08-24 11:52:41

    Jawapan yang diberikan oleh

    Pablo Santa Cruz adalah betul; namun, jika sesiapa terjumpa halaman ini dan memerlukan penjelasan lanjut, berikut ialah pecahan terperinci.

    Contoh jadual

    Andaikan kita mempunyai jadual berikut:

    -- t1
    id  name
    1   Tim
    2   Marta
    
    -- t2
    id  name
    1   Tim
    3   Katarina
    

    Sambungan dalaman

    Sambungan dalaman, seperti yang ditunjukkan di bawah:

    SELECT *
    FROM `t1`
    INNER JOIN `t2` ON `t1`.`id` = `t2`.`id`;

    hanya akan membenarkan kami melihat rekod yang muncul dalam kedua-dua jadual, seperti yang ditunjukkan di bawah:

    1 Tim  1 Tim
    

    Sambungan dalam tidak mempunyai arah (cth. kiri atau kanan) kerana ia adalah dua hala secara eksplisit - kita memerlukan kedua-dua belah untuk dipadankan.

    SERTAI LUAR

    Cambahan luar, sebaliknya, digunakan untuk mencari rekod yang mungkin tidak sepadan dalam jadual lain. Oleh itu, anda mesti menyatakan bahagian mana sambungan yang dibenarkan mempunyai rekod yang hilang. Singkatan untuk

    ; Saya akan menggunakan nama penuh mereka di bawah untuk mengukuhkan konsep cantuman luar dan cantuman dalam. LEFT JOINRIGHT JOINLEFT OUTER JOINRIGHT OUTER JOIN

    Sambung luar kiri

    Sambungan luar kiri, seperti yang ditunjukkan di bawah:

    SELECT *
    FROM `t1`
    LEFT OUTER JOIN `t2` ON `t1`.`id` = `t2`.`id`;

    ...akan mendapat semua rekod dari meja kiri tidak kira sama ada mereka mempunyai perlawanan di jadual kanan, seperti ini:

    1 Tim   1    Tim
    2 Marta NULL NULL
    

    Sambung luar kanan

    Sambungan luar kanan, seperti yang ditunjukkan di bawah:

    SELECT *
    FROM `t1`
    RIGHT OUTER JOIN `t2` ON `t1`.`id` = `t2`.`id`;

    ...akan mendapat semua rekod dari jadual kanan tidak kira sama ada mereka mempunyai perlawanan di jadual kiri, seperti ini:

    1    Tim   1  Tim
    NULL NULL  3  Katarina
    

    Sambungan luar penuh

    Gabungan luar yang lengkap akan memberikan kita semua rekod dari kedua-dua jadual tidak kira sama ada ia mempunyai padanan dalam jadual lain, atau NULL pada kedua-dua belah pihak jika tidak. Hasilnya kelihatan seperti ini:

    1    Tim   1    Tim
    2    Marta NULL NULL
    NULL NULL  3    Katarina
    

    Walau bagaimanapun, seperti yang ditunjukkan oleh Pablo Santa Cruz, MySQL tidak menyokong perkara ini. Kita boleh mensimulasikannya dengan UNION gabungan kiri dan kanan seperti ini:

    SELECT *
    FROM `t1`
    LEFT OUTER JOIN `t2` ON `t1`.`id` = `t2`.`id`
    
    UNION
    
    SELECT *
    FROM `t1`
    RIGHT OUTER JOIN `t2` ON `t1`.`id` = `t2`.`id`;

    Anda boleh menganggap

    sebagai "jalankan kedua-dua pertanyaan ini dan kemudian susun hasilnya"; UNION

    Perhatikan bahawa

    dalam MySQL menghapuskan pendua tepat: Tim akan muncul dalam kedua-dua pertanyaan di sini, tetapi keputusan untuk UNION 会消除精确的重复项:Tim 会出现在此处的两个查询中,但 UNION 的结果仅列出他一次。我的数据库专家同事认为不应依赖这种行为。因此,为了更明确地说明这一点,我们可以向第二个查询添加一个 WHERE hanya menyenaraikannya sekali. Rakan pakar pangkalan data saya percaya tingkah laku ini tidak boleh dipercayai. Jadi, untuk menjadikannya lebih jelas, kita boleh menambah klausa WHERE pada pertanyaan kedua:

    SELECT *
    FROM `t1`
    LEFT OUTER JOIN `t2` ON `t1`.`id` = `t2`.`id`
    
    UNION
    
    SELECT *
    FROM `t1`
    RIGHT OUTER JOIN `t2` ON `t1`.`id` = `t2`.`id`
    WHERE `t1`.`id` IS NULL;

    Sebaliknya, jika atas sebab tertentu anda mahu melihat pendua, anda boleh menggunakan UNION ALL.

    balas
    0
  • P粉148782096

    P粉1487820962023-08-24 10:04:47

    Anda tidak mempunyai sambungan penuh dalam MySQL, tetapi anda pasti boleh mensimulasikannya.

    Untuk kod contoh ditranskripsi daripada soalan Stack Overflow ini

    anda ada:

    Terdapat dua jadual t1 dan t2:
    SELECT * FROM t1
    LEFT JOIN t2 ON t1.id = t2.id
    UNION
    SELECT * FROM t1
    RIGHT JOIN t2 ON t1.id = t2.id

    Pertanyaan di atas sesuai untuk kes khas di mana operasi sambung luar yang lengkap tidak akan menghasilkan sebarang baris pendua. Pertanyaan di atas bergantung pada operator set UNION untuk mengalih keluar baris pendua yang diperkenalkan oleh corak pertanyaan. Kita boleh mengelak daripada memperkenalkan baris pendua dengan menggunakan corak anti-join

    pada pertanyaan kedua, dan kemudian menggunakan operator set UNION ALL untuk menggabungkan dua set. Dalam kes yang lebih umum di mana gabungan luar penuh akan mengembalikan baris pendua, kita boleh melakukan ini: 🎜
    SELECT * FROM t1
    LEFT JOIN t2 ON t1.id = t2.id
    UNION ALL
    SELECT * FROM t1
    RIGHT JOIN t2 ON t1.id = t2.id
    WHERE t1.id IS NULL

    balas
    0
  • Batalbalas