2012-08-22 12 views
7

Bu benim büyük sorunun zayıflayan sorgu olmakla özü iç seçkin dış seçme ile sınırlıdır nerede seçkin katılmak için çabalıyorum olmasıdır. Mümkün mü? İç seçimde çok parçalı tanıtıcı S.Item ve S.SerialNum hakkında bir hata alıyorum.İç seçim ifadesinin, dış seçime hangi yan tümce başvurduğunu belirten bir seçme ifadesine iç ekleme?

özü şudur, biz öğesi/seri göre gruplandırmak zorunda ve sorgu yeterince büyük, biz geri dönmek istiyorum ve bu minör katılmak için tüm sorguda grup her şey yoktur.

SELECT S.Item, S.SerialNum, S.ReceiveDate 
    FROM SALES S 
    INNER JOIN (SELECT W.Item, W.SerialNum, MIN(W.SalesDate) 
        FROM WARRANTY W 
        WHERE W.Item  = S.Item AND 
          W.SerialNum = S.SerialNum 
        GROUP BY Item, SerialNum, SalesDate) WW 
     ON S.Item = WW.Item AND WW.SerialNum 
+1

Burada soruyorsun tam emin değilim .. ama bu sorgunun görünüyor gelen İçinizdeki 'NEREDE W.Item kaldırmak .. . 'yan tümce ve 'ON' deyiminde içerir. İç birleşmeler otomatik olarak "WHERE" maddesinin sizin yapmaya çalıştığınız şeyi yaparlar .. – StuckAtWork

+0

Dış sorgu, iç sorgudaki herhangi bir değişkene başvurmuyor. Yani, sadece bir filtre gibi davranıyor. Dış sorguya minSalesDate eklediniz mi? –

+0

@GordonLinoff Bunu dahil etmek niyetindeyim, whoops. El sorgusu yazdı. –

cevap

13

yanlış yerde senin JOIN referansı var gibi görünüyor.

SELECT S.Item, S.SerialNum, S.ReceiveDate 
FROM SALES S 
INNER JOIN 
(
    SELECT W.Item, W.SerialNum, MIN(W.SalesDate) MinSalesDate 
    FROM WARRANTY W 
    GROUP BY Item, SerialNum 
) WW 
     ON S.Item = WW.Item 
     AND S.SerialNum = WW.SerialNum 

Düzenleme filtrelemeyle ilgili Yorumunuza dayalı, sen İçinizdeki SELECT üzerinde WHERE maddesini yerleştirebilirsiniz:

SELECT S.Item, S.SerialNum, S.ReceiveDate, WW.MinSalesDate 
FROM SALES S 
INNER JOIN 
(
    SELECT W.Item, W.SerialNum, MIN(W.SalesDate) MinSalesDate 
    FROM WARRANTY W 
    WHERE yourFilter here 
    GROUP BY Item, SerialNum 
) WW 
     ON S.Item = WW.Item 
     AND S.SerialNum = WW.SerialNum 
+2

Ayrıca "SalesDate", "GROUP BY" içinde olmamalı ve "MIN (W.SalesDate)" bir takma ada sahip olmalı. –

+0

@MartinSmith sabit, teşekkür – Taryn

+0

Yani koyamazsınız bir 'where' iç' select' açıklamada fıkra? Amaç, bazı sonuçların “Süresi doldu” statüsüne sahiptir, bu yüzden “MIN (EXPIRED)” ifadesini ekledim ve üzerine bir “grup” ekledim, sonra “EXPIRED = 0” değerine katıldı. Bunu yapamayacağım daha karmaşık olanların olup olmadığını merak ediyorum. –

2

Bunun yerine JOIN da bir common_table_expression deneyebilirsiniz. Check the WITH clause here.

Böyle bir şey olabilir:

WITH Warranty_CTE (Item, SerialNum, MinSalesDate) 
AS 
(
SELECT W.Item, W.SerialNum, MIN(W.SalesDate) MinSalesDate 
    FROM WARRANTY W 
    GROUP BY Item, SerialNum 
) 
SELECT S.Item, S.SerialNum, S.ReceiveDate 
FROM SALES S 
INNER JOIN Warranty_CTE WC 
     ON S.Item = WC.Item 
     AND S.SerialNum = WC.SerialNum 
+0

Bunu da bir şans vereceğim. Bu çözümün planı bluefeet çözümüyle aynı olmalıdır: Ben o –

+0

Jot bu çözümün Yürütme Planı hakkında NOT yukarıdan çalışan bulduk. (Yani arka planda optimizatörden aynı süreçte) Ama bence bu ifade daha okunabilir. –

+0

Kesinlikle daha okunabilir bir çözümü beğeniyorum. Bu daha yavaş mı? –

İlgili konular