2016-04-10 46 views
1

null değeriyle bir dönüş sütununun yerine geçmek Aşağıdaki sorguyu değiştirmek istiyorum, böylece ORDER.S_ID sütunu yerine, tablodan (STORES olarak adlandırılır) karşılık gelen NAME sütununun değerini alır S_ID ifade eder. Bununla birlikte, bazı durumlarda, S_ID değeri boştur, bu durumda karşılık gelen bir ad sütunu yoktur.Oracle SQL,

: sonuç kümesinin ikinci sütun

SELECT 
COUNT(*), ORDER.S_ID 
FROM 
ORDER, ORDERLIST 
WHERE 
ORDERLIST.O_ID = ORDER.ID AND 
ORDER.DATE = '13-APR. -09 19.42.05,259000000' 
GROUP BY S_ID; 

örnek veri null, böylece sorgu tarafından görüntülenen böylece ed ve, - Bu durumda, SİPARİŞ ve ORDERLIST ben COUNT istediğiniz tabloları (*) kayıtları hala var

SİPARİŞ tablo

ID DATE       S_ID 
----------------------------------------    
1 11-APR. -09 19.41.39,187000000 null 
2 12-APR. -09 19.42.05,259000000 null 
3 13-APR. -09 19.42.41,688000000 null 
11 16-APR. -09 22.06.11,169000000 3 

ORDERLIST tablo

O_ID B_ID PRICE 
--------------------- 
3  6  7999 
2  2  2000 
2  6  7999 
1  5  5000 
1  1  1000 
11  4  4000 
11  6  7999 

MAĞAZALAR t mümkün S_ID değeri boş değil bir tarih için kullanıcı sorguları eğer iade görmek istiyorum ne

ID NAME 
---------- 
1 Store1 
2 Store2 
3 Store3 

: tarih 16-APR sorgulandığında (bu özel bir durumdur. -09 22.06.11,169000000)

Ben boş IS eğer iade edilmesini istediğiniz ne
COUNT(*) STORENAME 
2  Store3 

. Tarih 13-APR için sorgulama (-09 19.42.41,688000000)

COUNT(*) STORENAME 
1  null 

cevap

1

Gordon'un dediği gibi, bir dış birleştirmeye ihtiyacınız var, ve özellikle dış birleştirmelerle, özellikle de öğretmeniniz ne kullanıyorsa, uygun birleştirme sözdizimini kullanmak çok daha iyi.

sırayla başlayarak ve eşleşen bir mağaza var olabilir, bu yüzden dış olmak saklar masaya katılmak gerek katılmak:

SELECT o.s_id, s.name, count(*) 
FROM "ORDER" o 
JOIN orderlist ol ON ol.o_id = o.id 
LEFT JOIN stores s ON s.id = o.s_id 
--WHERE o."DATE" = TO_TIMESTAMP('13-APR. -09 19.42.05,259000000', 'DD-MON". "-RR HH24.MI.SS,FF9') 
GROUP BY o.s_id, s.name; 

     S_ID NAME  COUNT(*) 
---------- ------ ---------- 
          5 
     3 Store3   2 

'sipariş' ve 'tarih' olduğu için Ayrılmış kelimeler bunlar için alıntılanmış tanımlayıcıları kullanmak zorunda kaldım, ancak gerçek isimler olmayabilirler. Onlardan kaçınmanız mümkün ise alıntılanan tanımlayıcıları kullanmayın. Bunu biraz daha az acı verici hale getirmek için tablo takma adlarını kullandım. "Tarih" de bir tarih yerine bir zaman damgasıdır, çünkü kısmi saniyeleriniz vardır, bu da adı daha da kafa karıştırıcı hale getirir.

Tarih/timestamp kısıtlaması yorumlama yaptım çünkü örnek verilerinizin hiçbiriyle eşleşmiyordu ve 12 Nisan'a kadar değiştirildiyse hala yalnızca bir tane eşleşti. NLS_TIMESTAMP_FORMAT’ınız ... sıra dışı, ancak bu ayrı bir sorun.senin NLS_TIMESTAMP_FORMAT aksine iki nokta üst üste ve saniye değeri ondalık kesir ayırıcı olarak nokta vardır

WHERE o."DATE" = TIMESTAMP '2009-04-12 19:42:05.259000000' 

Bildirimi: Karşılaştırma için bu değişmez bir zaman damgası kullanmak basittir. senin öğretmenim gerçekten eski Oracle özgü katılmak sözdizimi ısrar ederse


o zaman olarak ayarlayabilir:

SELECT o.s_id, s.name, count(*) 
FROM "ORDER" o, orderlist ol, stores s 
WHERE ol.o_id = o.id 
AND s.id (+) = o.s_id 
--AND o."DATE" = TIMESTAMP '2009-04-12 19:42:05.259000000' 
GROUP BY o.s_id, s.name; 

... ama neler olduğunu anlamaya çok daha zor, ve birleştirme koşullarında bir hata yapmak (veya tamamen dışarıda bırakmak) çok daha kolay.

+0

Teşekkürler, çözümünüz kusursuz bir şekilde çalıştı, tam ihtiyacım olan şey! Doğru hatırlamak, SQL geliştirici kullanıcının işletim sisteminden çıkarılır bir biçimde damgalarını görüntüler ve yerelleştirme bu. Mayın sonra Araçlar> Tercihler 'gidin SQL Developer tarih biçimini değiştirmek isterseniz ben * omuz silkme * –

+1

@aurellb yapıştırılan olanlar gibi gösterilir ...' ardından 'Veritabanı> NLS'options genişletmek ve tarihini değiştirmek veya orada (: MI: 'YYYY-AA-GG HH24 gibi bir şey için MI: zaman damgası için SSXFF' bir tarih ya da' YYYY-AA-GG HH24 için SS') zaman damgası biçimi. – MT0

+0

tercihlerde (bir NLS bölüm bulunmaktadır) ya ile o geçersiz kılabilir 'session' değiştirebilir. Tamamen meraktan çıkarılan yer, hangi yerel ürünü üretir? Fransızcayı tahmin ediyorum, “Avr” yerine “Apr” diye düşünüyorum. Ayın kısaltmasındaki boşluklar, varsayılan format değiştirilerek de bastırılabilir. –

0

Kullanımı left join. Aslında, her zaman açık join sözdizimini kullanır. from fıkrada Hiç kullanım virgül:

SELECT s.id, s.name, count(ol.o_id) 
FROM stores s left join 
    order o 
    on s.id = o.s_id left join 
    orderlist ol 
    on ol.o_id = o.id and 
     o.DATE = '13-APR. -09 19.42.05,259000000' 
GROUP BY s.id, s.name; 

from fıkrada virgül kullanılması dışında güncel yaklaşık iki yıldır olmuştur. Dış birleşmeler hakkında da bilgi edinmelisiniz.

+0

İlk sayımı() ait parantez kapatmak için unuttum ... doğru ANSI birleştirme sözdizimi kullanın: Öneriniz için teşekkür ederiz o, ben hemen denemek olacak! Ne yazık ki, bunlar SQL Developer yürütülürken –

+0

Bu sorgu, ilk sayım() maddesi için bağımsız değişken geçersiz sayıda iddia bir hata veriyor (Ben hala öğrenciyim) bize bu eski sözdizimi öğretirler. –