2016-04-07 39 views
1

Önemliyse PL/SQL kullanıyorum.Basit SQL Sorgu 1

Table = Stuff 

ID: FRUIT: 
100 Apple 
100 Grape 
200 Apple 
200 Orange 
550 Apple 
700 Orange 
800 Orange 
900 Grape 
... ... 

Ben Orange olarak aynı kimliği paylaşılmamaktadır Apples ve onların kimliklerinin tüm listelemek istiyorum. Bunu yapmayı nasıl yaparım? Sen diğerinden kayıtların bir set çıkarırsınız

100 Apple 
550 Apple 
+0

Bize beklenen çıktınızı ve muhtemelen denediğiniz bir sorguyu göstermeniz yararlı olur. –

+0

Düzenlendi, teşekkürler! Ben bir SQL sorgusu yok çünkü birleşim veya iç seçim olup olmadığını bilmiyorum :( – John

cevap

1

Bir alt sorgu ile yapabilirsiniz Elma ve ID'nin alt sorguda yer almadığı tüm meyveyi seçin. Böyle bir şey;

SELECT * 
FROM stuff 
WHERE fruit = 'Apple' 
    AND ID NOT IN (SELECT ID FROM stuff WHERE fruit = 'Orange') 
+0

Bu, kendim gibi yeni başlayanlar için en basit ve en kolay olanıydı, teşekkürler! – John

1

ve alt sorgu iş yapacak:

çıkışı olmalıdır. Yeni veriler için Düzenlendi

select * 
from stuff 
where fruit = 'Apple' 
and id not in (
select ID from stuff where fruit != 'Apple' 
); 

set Ya siz de bir EKSİ sorgusu kullanabilirsiniz.

+0

Bence elmalar için fazladan bir filtreye ihtiyacın var –

+0

@ vc74 Devam etmek zorunda olduğumuz bilgilerle söylemek zor. – kevinsky

+0

Eğer muzlar, tangeloslar ve papayalar varsa, bu maddeyi de içermeleri gerekmeyecektir .. Verilen bilgilere göre, kevinsky'nin cevabının mümkün olduğunca eksiksiz ve doğru olduğunu söyleyeyim. –

1

Sen CASE EXPRESSION kullanarak tablodan sadece bir kez seçebilir ve bunun gibi bir GROUP BY WITH HAVING fıkra: etkili sonra bu alt sorguda Portakal için kimlikleri tüm seçmemde böylece

SELECT t.id, 
     MAX(CASE WHEN t.FRUIT = 'Apple' THEN t.FRUIT end) as fruit 
FROM stuff t 
GROUP BY t.id 
HAVING MAX(CASE WHEN t.FRUIT = 'Orange' THEN 1 ELSE 0 END) = 0 
+0

Bu henüz gelişmiş değilim ama bu yeni ifadeler (Max, Case, vb.) bazılarını öğrendiğimde elimden geleni yapacağım .. Teşekkürler! – John

1

Orada sadece not exist kullanın Orange'ın kimlikleri tam listesini oluşturmak için gerek vardır:

select * 
from 
    stuff apple_list 
where 
    fruit = 'Apple' 
    and 
    not exists (
    select null 
    from stuff orange_instance 
    where orange_instance.id = apple_list.id 
) 

veya dış ile aynı şeyi yapmak katılmak:

select 
    id, fruit 
from (
    select 
    apple_list.id, 
    apple_list.fruit, 
    nvl2(orange_instance.id, 'orange_here', 'no_orange') orange_flag 
    from 
    stuff apple_list, 
    stuff orange_instance 
    where 
    apple_list.fruit = 'Apple' 
    and 
    orange_instance.id (+) = apple_list.id 
    and 
    orange_instance.fruit (+) = 'Orange' 
) 
where 
    orange_flag = 'no_orange' 

İkinci varyant distinct ihtiyacı Aynı kimliğe sahip iki Portakal sahibi olma olasılığı varsa seçim yapın.

+0

Bunlar harika örnekler! Teşekkürler! – John

1

Yoksa EKSİ seti operatörünü kullanarak bunu yapabilirsiniz:

SELECT a.ID, a.FRUIT 
    FROM STUFF a 
    WHERE a.FRUIT = 'Apple' 
MINUS 
SELECT b.ID, 'Apple' AS FRUIT 
    FROM STUFF b 
    WHERE b.FRUIT = 'Orange' 

İyi şanslar.