Bagaimana untuk melakukan FULL OUTER JOIN dalam MySQL?
P粉930534280
P粉930534280 2023-08-23 15:16:38
0
2
483
<p>Saya mahu melakukan <em>sambungan luar penuh</em> adakah mungkin? Adakah MySQL menyokong <em>sambungan luar penuh</em>? </p>
P粉930534280
P粉930534280

membalas semua(2)
P粉022723606

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.

P粉148782096

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
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!