Saya perlu menerapkan kueri berikut di SQL Server:
select *
from table1
WHERE (CM_PLAN_ID,Individual_ID)
IN
(
Select CM_PLAN_ID, Individual_ID
From CRM_VCM_CURRENT_LEAD_STATUS
Where Lead_Key = :_Lead_Key
)
Tetapi klausa WHERE..IN hanya mengizinkan 1 kolom. Bagaimana saya bisa membandingkan 2 kolom atau lebih dengan SELECT dalam lainnya?
sql-server
ala
sumber
sumber
Jawaban:
Anda bisa membuat tabel turunan dari subquery, dan gabung table1 ke tabel turunan ini:
sumber
Anda akan ingin menggunakan sintaks WHERE EXISTS sebagai gantinya.
sumber
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:
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:
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.
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
Solusi tanpa duplikasi kode (saya percaya ini tidak berfungsi dalam permintaan SQL Server reguler)
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.
Kesalahan paling umum:
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.
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.
sumber
Catatan:
Oracle mengabaikan baris di mana satu atau lebih kolom yang dipilih adalah NULL. Dalam kasus ini, Anda mungkin ingin menggunakan NVL -Funktion untuk memetakan NULL ke nilai khusus (yang seharusnya tidak ada dalam nilai-nilai);
sumber
where (colA,colB) in (... some list of tuples...)
tetapi saya tidak yakin apa yang dilakukan oleh basis data lain. Saya tertarik untuk tahu.Klausa EXISTS sederhana adalah terbersih
Jika Anda memiliki beberapa baris dalam korelasi maka GABUNG memberikan beberapa baris dalam output, jadi Anda harus berbeda. Yang biasanya membuat EXIS lebih efisien.
Catatan
SELECT *
dengan GABUNG juga akan menyertakan kolom dari tabel pembatas barissumber
Mengapa menggunakan WHERE EXISTS atau DERIVED TABLES ketika Anda hanya bisa melakukan inner join normal:
Jika pasangan (CM_PLAN_ID, Individual_ID) tidak unik di tabel status, Anda mungkin perlu SELECT DISTINCT t. * Sebagai gantinya.
sumber
1.Menggunakan dengan
EXISTS
[Waktu Permintaan Rata-rata: 1.42s]2.Menggunakan dengan dua baris
IN
Ayat [Waktu Permintaan Rata-rata: 0,37d]3.Menggunakan dengan
INNNER JOIN
pola [Waktu Permintaan Rata-rata: 2,9s]Jadi, saya memilih opsi kedua.
sumber
AND
pernyataan daripadaOR
pernyataan.OR
pernyataan mungkin meningkatkan duplikasi. Dalam kasus saya, belum ada baris yang berisi samasrc_id
dandest_id
dalam satu baris. Jadi, duplikasi tidak akan terjadi dalam kasus saya.Pertanyaan:
kueri di atas bekerja untuk saya di mysql. lihat tautan berikut ->
https://www.w3resource.com/sql/subqueries/multiplee-row-column-subqueries.php
sumber
Jika Anda menginginkan satu tabel maka gunakan kueri berikut
dan data tabel sebagai berikut
Kemudian output sebagai berikut
sumber
id in (1,2) and studentName in ('a','b')
sama sekali tidak sama dengan(id, studentName) in ((1,'a'),(2,'b'))
. Pikirkan saja sebuah catatan yang memiliki id = 2 dan name = 'a'. Tentu saja, jika ID unik, maka efeknya berkurang, tetapi kemudian, jika ID unik, kita tidak perlu menyaring nama sama sekali.Kita bisa melakukan ini.
sumber
Menggabungkan kolom bersama dalam beberapa bentuk adalah "retas", tetapi ketika produk tidak mendukung setengah bergabung untuk lebih dari satu kolom, kadang-kadang Anda tidak punya pilihan.
Contoh di mana solusi gabungan luar / dalam tidak akan berfungsi:
Ketika pertanyaan tidak sepele di alam kadang-kadang Anda tidak memiliki akses ke tabel dasar yang ditetapkan untuk melakukan gabungan dalam / luar biasa.
Jika Anda menggunakan "retasan" ini, saat Anda menggabungkan bidang, pastikan untuk menambahkan cukup pembatas di antaranya untuk menghindari salah tafsir, mis.
ColA + ":-:" + ColB
sumber
Saya mendirikan lebih mudah dengan cara ini
Semoga bantuan ini :)
sumber
CM_PLAN_ID = 45
danIndividual_ID = 3
kemudian hasil gabungan453
- yang tidak dapat dibedakan dari kasus di manaCM_PLAN_ID = 4
danIndividual_ID = 53
... meminta masalah saya akan berpikir45_3
atau45:3
tetapi itu masih bukan solusi yang bagus dan tentu saja seperti @mrdenny mengatakan indeks tidak akan digunakan sekarang karena transformasi telah terjadi pada kolom.Cara sederhana dan salah akan menggabungkan dua kolom menggunakan + atau menyatukan dan membuat satu kolom.
Ini akan menjadi sangat lambat. Tidak dapat digunakan dalam pemrograman tetapi jika seandainya Anda hanya ingin memverifikasi sesuatu dapat digunakan.
sumber