Oracle SQL so'rovining barcha majburiy qiymatlari bilan shartlari

ORACLE-dagi bitta tanlangan so'rovni yozishni istayman, u faqatgina qaerda mavjud bo'lgan barcha qiymatlarni ifodalaydi. Masalan,

select * from emp where empid in (7521,7566,7698)

Endi bu so'rovni yozmoqchiman, shuning uchun qiymati 3 marta ishlaganda faqat qiymat qaytarishi kerak. Masalan, empid = 7521 va empid = 7566 va empid = 7698 kabi bo'ladi. Agar biron bir qiymat bo'lmasa, bu so'rov hech qanday qatorni keltirmasligi kerak.

2
Bir qadriyatlar ro'yxatini qanday qilib foydalanishingiz mumkin bo'lgan narsaga aylantirish uchun stackoverflow.com/q/4672545/55922 saytiga tashrif buyuring. IN bayonotida. U erda, ularning barchasi borligiga ishonch hosil qilish uchun analitik funktsiyadan foydalanishni tavsiya qilaman a_horse_with_no_name tomonidan tavsiya etilgan qiymatlarni hisoblash va siz ro'yxatidagi elementlarning soniga (id_list) uzunligi (uzunligi (Id_list, ',') 'ni almashtiring)
qo'shib qo'ydi muallif Craig, manba

2 javoblar

Xuddi shu so'rovni qayta tiklang, ichki o'rnatilgan tanlov sifatida va uning yozuvlarini hisoblang

select * from emp 
where empid in (7521, 7566, 7698)
and 3 = (select count(*) from emp where empid in (7521, 7566, 7698))

Shu bilan bir qatorda, original natijada analitik funktsiyadan foydalaning va quyidagilarni tekshiring:

select * from (
  select emp.*, count(*) over() as cnt
  from emp where empid in (7521, 7566, 7698)
)
where cnt = 3
4
qo'shib qo'ydi
@ user1017936: O'ylaymanki, siz uni dinamik qilib ko'rsatishingiz mumkin? Tegishli identifikatorni qaerda saqlaysiz?
qo'shib qo'ydi muallif Lukas Eder, manba
@ user1017936: Men tushunganimga amin emasman ... Ammo, bu yangi savolga loyiq bo'lmagan yangi muammolar. So'rovlar davom etar ekan, sizga ikkita tegishli variantni berdim.
qo'shib qo'ydi muallif Lukas Eder, manba
Lekin bu erda mening dinamik holatim bor, u faqat 3 ta emas
qo'shib qo'ydi muallif user1017936, manba
Aslida u ba'zi qidirish sharoitlari uchun ishlatiladi. Ha hisoblashim mumkin, lekin yana bitta muammoli foydalanuvchi magistrdagi qiymatlarni vergul bilan ajratilgan qiymatlar bilan kiritadi, shuning uchun men IN so'rovida foydalana olmayman.
qo'shib qo'ydi muallif user1017936, manba

Lukasning versiyasiga bir marta murojaat qilish kerak bo'lgan joy:

with emp_ids as (
   select 7521 as eid from dual
   union all 
   select 7566 from dual
   union all
   select 7698 from dual
)
select * 
from (
  select emp.*, 
         count(*) over() as cnt
  from emp_new emp
  where empid in (select eid from emp_ids)
)
where cnt = (select count(*) from emp_ids);

Bunday holatlarda men doimo boshqa kodlashlar bilan ishlaydigan standart sxemani ishlab chiqaruvchini sog'indim, unda istalgan qiymatlar bilan virtual jadval yaratish uchun VALUES (7521), (7566), (7698) yozishim mumkin. DUALdan foydalanish kerak bo'lmasdan ...

3
qo'shib qo'ydi
Yaxshi echim. Men odatiy xotira jadvallarini yaratish uchun CTE haqida o'ylamaganman. Haqiqatdan ham, afsuski, Oracle'da mavjud bo'lgan har qanday standart TABLE yoki VARRAY turi mavjud emas ...
qo'shib qo'ydi muallif Lukas Eder, manba
Bu sizning savolingizda yoki Luqasning javobiga izohlaringiz emas (va " bir ota-ona bor " bilan nimani anglatishini aniq bilmayman)
qo'shib qo'ydi muallif a_horse_with_no_name, manba
@ user1017936: agar bu yechim mukammal ishlamasa, uni qabul qilishingiz mumkin.
qo'shib qo'ydi muallif Adam Musch, manba
Keling, ba'zi qiyinchiliklar mavjud, ya'ni emp_idlardan olingan emizish ham ba'zi ota-onalarga ega, shuning uchun u erda mening hisobim oshadi.
qo'shib qo'ydi muallif user1017936, manba
Barchaga rahmat. U mukammal ishlaydi.
qo'shib qo'ydi muallif user1017936, manba
Siz allaqachon qabul qilingan eski postimga sharh berdingiz
qo'shib qo'ydi muallif user1017936, manba