Nerede koşulda tüm zorunlu değerlerle Oracle sql sorgu

ORACLE'de yalnızca koşulda verilen tüm değerler varsa kayıtları döndürecek bir seçim sorgusu yazmak istiyorum. Örneğin.

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

Şimdi bu sorguyu yazmak istiyorum, böylece SADECE 3 ifadenin tümü mevcut olduğunda SADECE değer döndürmelidir. AND koşulu gibi olacaktır, yani empid = 7521 ve empid = 7566 ve empid = 7698. Eğer bir değer yoksa, bu sorgu herhangi bir satır getirmemelidir.

2
Bir değer listesini bir listede kullanabileceğiniz bir şeye nasıl dönüştüreceğinizi öğrenmek için stackoverflow.com/q/4672545/55922 adresine bakın. Deyimi. Oradan, hepsine sahip olduğunuzdan emin olmak için, a_horse_with_no_name tarafından önerilen değerleri saymak ve analitik işlevini kullanmanızı tavsiye ederim ve listenizde uzunluk (id_list) - uzunluk kullanarak bulunabilecek öğe sayısına uyduğundan emin olun. değiştir (id_list, ',')) + 1
katma yazar Craig, kaynak

2 cevap

Aynı sorguyu yuvalanmış bir seçim olarak tekrar çalıştırın ve kayıtlarını sayın

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

Alternatif olarak, orijinal sonuç üzerinde analitik bir fonksiyon kullanın ve aşağıdakileri kontrol edin:

select * from (
  select emp.*, count(*) over() as cnt
  from emp where empid in (7521, 7566, 7698)
)
where cnt = 3
4
katma
@ user1017936: Sanırım, dinamik olarak yapabilirsin, sonra? İlgili kimliği nerede saklıyorsunuz?
katma yazar Lukas Eder, kaynak
@ user1017936: Anladığımdan emin değilim ... Ama sanırım bu yeni bir soruyu hak eden yeni bir ilgisiz sorun. Sorgu devam ettiği sürece, size iki geçerli seçenek verdim.
katma yazar Lukas Eder, kaynak
ama burada benim durumum dinamik, sadece 3'e sabit değil
katma yazar user1017936, kaynak
Aslında bazı arama koşulları için kullanılır. Evet sayabilirim ama yine bir sorun var kullanıcı bir virgülle ayrılmış değerleri olan dize değerleri girecek böylece IN sorgu kullanamıyorum.
katma yazar user1017936, kaynak

Lukas'ın sürümüne yalnızca bir kez kimlik numarası yazmanız gereken bir uzantısı:

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);

Bu durumlarda her zaman diğer DBMS'de bulunan standart satır yapıcısını özlüyorum, burada istenen değerleri içeren sanal bir tablo oluşturmak için basitçe VALUES (7521), (7566), (7698) yazabilirim DUAL kullanmaya gerek kalmadan ...

3
katma
Güzel çözüm. Geçici bellek tabloları oluşturmak için CTE'leri hiç düşünmedim. Gerçekten de yazık ki, Oracle'da kullanılabilen herhangi bir varsayılan TABLE veya VARRAY türü bulunmuyorsa ...
katma yazar Lukas Eder, kaynak
Sorunuzda veya Lukas'ın cevabına yorumlarınızda anlattığınız şey bu değil (ve " bir ebeveyne sahip " ile ne demek istediğinizi anlamadım)
katma yazar a_horse_with_no_name, kaynak
@ user1017936: eğer bu çözüm mükemmel çalışıyorsa, belki de kabul etmelisiniz.
katma yazar Adam Musch, kaynak
Şimdi burada bazı karmaşıklıklar var, yani emp_ids'ten aldığımız bayramın da bazı ebeveynleri var, sayım artacak.
katma yazar user1017936, kaynak
Herkese teşekkürler. Mükemmel çalışıyor.
katma yazar user1017936, kaynak
Zaten kabul edilen eski gönderime yorum yaptın
katma yazar user1017936, kaynak