Saya melakukan beberapa pekerjaan pemeliharaan pada aplikasi database dan saya telah menemukan bahwa, kegembiraan sukacita, meskipun nilai-nilai dari satu tabel digunakan dalam gaya kunci asing, tidak ada batasan kunci asing di atas tabel.
Saya mencoba menambahkan batasan FK pada kolom ini, tapi saya menemukan itu, karena sudah ada banyak data buruk di tabel dari kesalahan sebelumnya yang telah diperbaiki secara naif, saya perlu menemukan baris yang tidak cocokkan dengan tabel lainnya dan kemudian hapus.
Saya telah menemukan beberapa contoh permintaan semacam ini di web, tetapi mereka semua tampaknya memberikan contoh daripada penjelasan, dan saya tidak mengerti mengapa mereka bekerja.
Dapatkah seseorang menjelaskan kepada saya bagaimana membangun kueri yang mengembalikan semua baris tanpa kecocokan di tabel lain, dan apa yang dilakukannya, sehingga saya bisa membuat kueri ini sendiri, daripada berlari ke SO untuk setiap tabel dalam kekacauan ini yang memiliki tidak ada kendala FK?
sumber
NULL
ID valid di skema Anda, Anda mungkin memiliki masalah yang lebih besar, tidakkah Anda setuju? :)SELECT t1.ID, t2.ID
dan menghapus baris WHERE Anda akan mendapatkan ide yang lebih baik bagaimana ini bekerja.Saya akan menggunakan
EXISTS
ekspresi karena lebih kuat, Anda dapat memilih baris yang ingin Anda ikuti, jikaLEFT JOIN
Anda harus mengambil semua yang ada di tabel bergabung. Efisiensinya mungkin samaLEFT JOIN
dengan uji nol.sumber
EXISTS
adalah variabilitasnya.WHERE t2.id IS NULL
) Terima kasih.Tabel 1 memiliki kolom yang ingin Anda tambahkan batasan kunci asing, tetapi nilai dalam
foreign_key_id_column
tidak semua cocok denganid
tabel 2.id
s dari table1. Ini akan menjadi baris yang ingin kita hapus.NOT IN
klausul dalam mana pernyataan membatasi query untuk hanya baris di mana nilai dalamforeign_key_id_column
tidak dalam daftar tabel 2id
s.SELECT
pernyataan dalam kurung akan mendapatkan daftar semuaid
s yang berada di tabel 2.sumber
IN
klausa dengan daftar nilai literal. Itu tidak berlaku untuk menggunakanIN
klausa dengan hasil sub-permintaan. Jawaban yang diterima untuk pertanyaan itu sebenarnya memecahkan masalah dengan menggunakan sub-kueri. (Daftar besar nilai literal bermasalah karena ia menciptakan ekspresi SQL yang besar. Sub-kueri berfungsi dengan baik karena, bahkan jika daftar yang dihasilkan besar, ekspresi SQL itu sendiri kecil.)Di mana
T2
tabel tempat Anda menambahkan batasan:Dan hapus hasilnya.
sumber
Biarkan kami memiliki 2 tabel berikut (gaji dan karyawan)
Sekarang saya ingin catatan-catatan dari tabel karyawan yang tidak dalam gaji. Kita dapat melakukan ini dalam 3 cara:
sumber
Dari pertanyaan serupa di sini MySQL Inner Gabung Query Untuk Mendapatkan Catatan Tidak Hadir di Tabel Lain Saya berhasil ini
smalltable
adalah di mana Anda memiliki catatan yang hilang,bigtable
adalah di mana Anda memiliki semua catatan. Permintaan daftar semua catatan yang tidak ada dismalltable
tetapi ada dibigtable
. Anda dapat menggantiid
dengan kriteria pencocokan lainnya.sumber
Anda dapat memilih Tampilan seperti yang ditunjukkan di bawah ini:
dan kemudian bekerja pada tampilan untuk memilih atau memperbarui:
yang menghasilkan hasil seperti yang ditunjukkan pada gambar di bawah ini yaitu untuk kolom yang tidak cocok nol telah diisi.
sumber
Saya Tidak Tahu Yang mana yang Dioptimalkan (dibandingkan dengan @AdaTheDev) tetapi yang ini tampaknya lebih cepat ketika saya gunakan (minimal untuk saya)
Jika Anda ingin mendapatkan atribut spesifik lainnya, Anda dapat menggunakan:
sumber
SELECT * FROM First_table MINUS SELECT * FROM another
sumber
Anda dapat melakukan hal seperti ini
sumber
Bagaimana cara memilih baris tanpa entri yang cocok di kedua tabel?
sumber