2012-09-24 16 views
6

Güncelleştirmeler aşağıdan.DIŞ JOIN sonucu eksik satır yok, WHERE yan tümcesi (Geçici çözüm bulundu)

Her kayıt için, onu ve ondan sonra ortaya çıkan tüm diğer kayıtları veya kendisinin en son kaydıysa NULL değerini döndüren bir dış dış birleştirme yapmaya çalışıyorum. O,

SELECT A.[CR#], A.REGIS_STATUSDATE, B.REGIS_STATUSDATE 
FROM CR_ADMIN_REGIS_STATUS A LEFT OUTER JOIN CR_ADMIN_REGIS_STATUS B 
ON A.[CR#]=B.[CR#] AND A.REGIS_STATUSDATE < B.REGIS_STATUSDATE 

Sorunum bu Verilen [CR #] için, A.REGIS_STATUSDATE maksimum olduğu zaman, (ve bu nedenle B.REGIS_STATUSDATE bunun daha büyük olamaz) olmasıdır geçerli: Bu benim sql kodudur satır sonuçta yer almıyor.

CR# A.REGIS_STATUSDATE B.REGIS_STATUSDATE 
1  5/1/12    5/2/12 
1  5/1/12    5/3/12 
1  5/2/12    5/3/12 
2  5/1/12    5/2/12 

göz önüne alındığında:

CR# REGIS_STATUSDATE 
1  5/1/12 
1  5/2/12 
1  5/3/12 
2  5/1/12 
2  5/2/12 

beklediğim benim sorgu sonucu

CR# A.REGIS_STATUSDATE B.REGIS_STATUSDATE 
1  5/1/12    5/2/12 
1  5/1/12    5/3/12 
1  5/2/12    5/3/12 
1  5/3/12    NULL 
2  5/1/12    5/2/12 
2  5/2/12    NULL 

Onun yerine bu olsun olması: CR_ADMIN_REGIS_STATUS şuna benzer Örneğin

, benim sorgum bir LEFT OUTER JOIN, ve WHERE yan tümcesi yok, tüm satırları özgün tablodan bekliyorum Sonuçta, bu durum böyle değil. Burada neyi özlüyorum?

Düzenleme: Bu Access 2007

Güncelleme: Ben Ben ayrı bir tabloya tablo CR_ADMIN_REGIS_STATUS bölümleri kopyalanamaz ve bu karşı benim sorgu çalıştırmanız durumunda ne olacağını görmek karar verdi. Ben sadece düz bir şekilde bütün tabloyu kopyaladım bile (el ile) sorguyu çalıştı! Bu aslında sadece kopyalama ve yapıştırma yaparken, başka bir tabloya SEÇMEYECEĞİMde sorun devam edecekti.
Sonunda ben

SELECT * 
FROM CR_ADMIN_REGIS_STATUS 
UNION ALL SELECT TOP 1 * 
FROM CR_ADMIN_REGIS_STATUS; 

karşı sorgu çalıştırmanız durumunda yerine CR_ADMIN_REGIS_STATUS kendisinden daha benim sorgu istenen sonuç verdiğini keşfetti. Tuhaf. Aynı zamanda, benzer bir tabloya benzer bir sorguya başladım, bu da başlangıçtan beri işe yaradı, bu yüzden bu tek bir tabloyla sınırlı bir sorun gibi görünüyor.

+1

kullanıyorsunuz DBMS? Erişim? –

+0

Peki bu da bana kafamı kaşımıyor –

+0

Sorguyu çalıştıran MS Access 2010'da beklenen sonuca ulaşıyorum. – Fionnuala

cevap

1

Hiçbir şey kaçırmıyorsunuz. Böyle bir durumda, bu bir hatadır.

MS-Access tarafından kullanılan motorda çeşitli hatalar var. "Karmaşık" ON koşullarına sahip olan birleşimlerde benzer, gizli davranışlar gördüm. Access'in buggy sonuçlarını verdiği başka bir soruya bakın: Why does my left join in Access have fewer rows than the left table?

Sorguyu SQL-Server, Oracle, Postgres, hatta MySQL ile aynı verilerle deneyebilirsiniz ve doğru, beklenen sonuçları elde edersiniz. Geçici bir çözüm olarak


, bir UNION ile sorgu yeniden yazma deneyebilirsiniz, ancak bir doğruluğu konusunda emin olamaz: Eğer

SELECT A.[CR#], A.REGIS_STATUSDATE, B.REGIS_STATUSDATE 
FROM CR_ADMIN_REGIS_STATUS A 
    INNER JOIN CR_ADMIN_REGIS_STATUS B 
    ON A.[CR#]=B.[CR#] 
    AND A.REGIS_STATUSDATE < B.REGIS_STATUSDATE 

UNION ALL 

SELECT A.[CR#], A.REGIS_STATUSDATE, NULL 
FROM CR_ADMIN_REGIS_STATUS A 
WHERE NOT EXISTS 
     (SELECT * 
     FROM CR_ADMIN_REGIS_STATUS B 
     WHERE A.[CR#]=B.[CR#] 
      AND A.REGIS_STATUSDATE < B.REGIS_STATUSDATE 
    ) ; 
+0

MS Access'te beklenen sonucu elde ediyorum. – Fionnuala

+0

Hızlı cevabınız için, bu hatayı duymak kadar hayal kırıklığı yarattığınız için teşekkür ederiz. Geçici çözümünüzü deneyeceğim. – msender

+0

@Remou: Diğer bir soruya cevap verdiğimde, 2 tablo ve çok az satır, 2 veya 3 olmak üzere birkaç test yapmıştım. "A.id = b.id OR a.x IS NULL" ya da benzer koşullara sahip olan sorgular çok garip sonuçlar verdi. –

İlgili konular