PERINGATAN TENTANG SOLUSI:
SOLUSI YANG BANYAK ADA AKAN MEMBERIKAN OUTPUT YANG SALAH JIKA ROW TIDAK UNIK
Jika Anda adalah satu-satunya orang yang membuat tabel, ini mungkin tidak relevan, tetapi beberapa solusi akan memberikan jumlah baris output yang berbeda dari kode yang dimaksud, ketika salah satu tabel mungkin tidak mengandung baris unik.
PERINGATAN TENTANG PERNYATAAN MASALAH:
DALAM DENGAN KOLOM GANDA TIDAK ADA, BERPIKIR DENGAN SEKSAMA APA YANG ANDA INGINKAN
Ketika saya melihat sebuah dengan dua kolom, saya bisa membayangkan itu berarti dua hal:
- Nilai kolom a dan kolom b muncul di tabel lainnya secara independen
- Nilai kolom a dan kolom b muncul bersama di tabel lainnya pada baris yang sama
Skenario 1 cukup sepele, cukup gunakan dua pernyataan IN.
Sejalan dengan sebagian besar jawaban yang ada, saya dengan ini memberikan tinjauan umum tentang pendekatan yang disebutkan dan tambahan untuk Skenario 2 (dan penilaian singkat):
EXISTS (Aman, disarankan untuk SQL Server)
Seperti yang disediakan oleh @mrdenny, EXISTS terdengar persis seperti yang Anda cari, berikut adalah contohnya:
SELECT * FROM T1
WHERE EXISTS
(SELECT * FROM T2
WHERE T1.a=T2.a and T1.b=T2.b)
LEFT SEMI JOIN (Aman, disarankan untuk dialek yang mendukungnya)
Ini adalah cara yang sangat ringkas untuk bergabung, tetapi sayangnya sebagian besar dialek SQL, termasuk server SQL saat ini tidak mendukungnya.
SELECT * FROM T1
LEFT SEMI JOIN T2 ON T1.a=T2.a and T1.b=T2.b
Berbagai pernyataan IN (Aman, tetapi waspadai duplikasi kode)
Seperti yang disebutkan oleh @cataclysm menggunakan dua pernyataan IN dapat melakukan trik juga, mungkin bahkan akan mengungguli solusi lain. Namun, Anda harus sangat berhati-hati dengan duplikasi kode. Jika Anda ingin memilih dari tabel yang berbeda, atau mengubah pernyataan where, itu adalah risiko yang meningkat bahwa Anda membuat inkonsistensi dalam logika Anda.
Solusi dasar
SELECT * from T1
WHERE a IN (SELECT a FROM T2 WHERE something)
AND b IN (SELECT b FROM T2 WHERE something)
Solusi tanpa duplikasi kode (saya percaya ini tidak berfungsi dalam permintaan SQL Server reguler)
WITH mytmp AS (SELECT a, b FROM T2 WHERE something);
SELECT * from T1
WHERE a IN (SELECT a FROM mytmp)
AND b IN (SELECT b FROM mytmp)
INNER BERGABUNG (secara teknis dapat dibuat aman, tetapi seringkali ini tidak dilakukan)
Alasan mengapa saya tidak merekomendasikan menggunakan gabungan dalam sebagai filter, adalah karena dalam praktiknya orang sering membiarkan duplikat di tabel kanan menyebabkan duplikat di tabel sebelah kiri. Dan kemudian membuat keadaan menjadi lebih buruk, mereka kadang-kadang membuat hasil akhir yang berbeda sementara tabel kiri sebenarnya mungkin tidak perlu unik (atau tidak unik di kolom yang Anda pilih). Lebih lanjut itu memberi Anda kesempatan untuk benar-benar memilih kolom yang tidak ada di tabel sebelah kiri.
SELECT T1.* FROM T1
INNER JOIN
(SELECT DISTINCT a, b FROM T2) AS T2sub
ON T1.a=T2sub.a AND T1.b=T2sub.b
Kesalahan paling umum:
- Bergabung langsung di T2, tanpa subquery yang aman. Menghasilkan risiko duplikasi)
- SELECT * (Dijamin mendapatkan kolom dari T2)
- SELECT c (Tidak menjamin bahwa kolom Anda datang dan selalu akan datang dari T1)
- Dilarang MENYERAH atau MENYANGKAL di tempat yang salah
KONCATENASI KOLOM DENGAN SEPARATOR (Tidak terlalu aman, kinerja mengerikan)
Masalah fungsionalnya adalah jika Anda menggunakan pemisah yang mungkin muncul dalam kolom, sulit untuk memastikan bahwa hasilnya 100% akurat. Masalah teknisnya adalah bahwa metode ini sering menimbulkan konversi jenis dan mengabaikan indeks sepenuhnya, sehingga menghasilkan kinerja yang mengerikan. Terlepas dari masalah ini, saya harus mengakui bahwa kadang-kadang saya masih menggunakannya untuk permintaan ad-hoc pada dataset kecil.
SELECT * FROM T1
WHERE CONCAT(a,"_",b) IN
(SELECT CONCAT(a,"_",b) FROM T2)
Perhatikan bahwa jika kolom Anda berupa angka, beberapa dialek SQL akan meminta Anda untuk memasukkannya terlebih dahulu ke string. Saya percaya SQL server akan melakukan ini secara otomatis.
Untuk menyelesaikannya: Seperti biasa ada banyak cara untuk melakukan ini dalam SQL, menggunakan pilihan yang aman akan menghindari kejutan dan menghemat waktu dan waktu Anda dalam jangka panjang.