2009-03-14 22 views
6

Bunu bir SQL Server CE veritabanında yapmaya çalışıyorum, ancak veritabanı altyapısı raporlama hatalarını tutar.Alt sorgu

SELECT C.guid, C.name, C.updated, 
     C.hddsize, C.hddavailable, C.hddfree, 
     C.ramsize, C.profiles, C.cpu, 
     (SELECT COUNT(D.id) AS numprogs 
      FROM ComputerData AS D 
      WHERE D.computer_id = C.id) AS numprograms 
FROM Computers AS C; 

SQL Server CE'nin alt sorguları desteklediği söylendi. Yanlış yaptığım bir şey mi var?

+0

Hata nedir? –

+0

Merhaba, Üzgünüm, düzeltildi. Hepinize teşekkürler, Azuka – Zahymaka

cevap

5

Sorgulardaki tek deneyimlerim MySQL ile olsa da, umarım yeterlidir.

Sorgunuz bana tuhaf geliyor çünkü alt sorgunuz SELECT deyimindedir. Bunu daha önce hiç görmedim ... ama görünüşe göre MySQL'de destekleniyor. Genellikle alt sorgu bir FROM veya SOL JOIN veya JOIN sonra gelir.

Sizin örnek bir SOL uygulamak olabilir yeterince basittir

JOIN:

Bu durumda
SELECT C.guid, ..., COUNT(distinct D.id) as numprogs 
FROM Computers AS C 
LEFT JOIN ComputerData as D ON D.computer_id = C.id 

, SOL eşleşen kaydında olsa dahi, çünkü kullanmak katılmak doğru türüdür KATILIN Belirli bir C kaydı için D tablosu, sonuç kümeniz yine de C kaydının ve numprogs'un beklediğiniz gibi sıfır olacağını içerir. Bunun çalışması gerekir mümkün olan en basit sorgu için buraya getirmeni Sorgunuzla basitleştirilmesi öneririz

SELECT C.guid, ..., S.numprogs 
FROM Computers AS C 
LEFT JOIN 
(SELECT computer_id, COUNT(*) as numprogs 
FROM ComputerData GROUP BY computer_id) AS S 
ON C.id=S.computer_id 

ama çalışmıyor: Gerçekten bir alt sorgu kullanmak istiyorsanız

, bunu deneyin. Ardından, veritabanı motorunuzun geri döndüğü belirli bir hata iletisini bize bildirin.

Düzenleme: Ben MySQL chapter about subqueries içinde loooked ve alt sorgunuzdan sonra "numprograms" yan tümcesi kaldırmayı denediğiniz gibi görünüyor ... belki de gelen sütunun adlandırma hakkında herhangi bir seçim almazsınız alt sorguyu oluşturduktan sonra alt sorgu.

+1

Teşekkürler adamım. İlk sorgu işe yaramadı, ama ikinci yaptı - mükemmel. Sayımın 0 olduğu durumlarda NULL değerini döndürür, ancak alacağımı bildiğim verilere dayanarak,% 99.99 eminim ki asla 0 sayım olmayacaktır. Tekrar teşekkürler, Azuka – Zahymaka

+0

Serin, işe yaradığını bilmek güzel! % 100 emin olmak istiyorsanız, değer null değilse, "IF (S.numprogs IS NULL, 0, S.numprogs)" ile S.numprogs'ı değiştirebilir veya "IFNULL (S" olan kısa gösterim ") kullanabilirsiniz. .numprogs, 0) " –

23

SQL CE'deki sınırlama, bir skaler değer döndüren alt sorguları desteklememesidir. Bir kümeyi döndüren alt sorgular para cezası kesilir.

Grayson yanıtındaki birleşimdeki alt sorgu bir set döndürdüğü için çalışması gerekir. Bazen bir skaler alt sorgu bir birleştirme koşulunda önlenemez. '=' Yerine 'IN' kullanarak, ayrıştırıcı kandırılabilir.

Cevabımı this question adresine bakın.

+0

Güzel, bu çözüm benim için çalıştı! –