2010-09-22 7 views
0

Récemment, un utilisateur très sympathique sur stackoverflow m'a aidé avec ce SQL:une longue extension SQL avec des jointures internes (serveur 2000)

SELECT (SELECT TOP 1 
       a.id 
      FROM vAnalysesHistory AS a 
      WHERE a.companyid = n.stockid 
     ORDER BY a.chosendatetime DESC) AS id, 
     n.name, 
     (SELECT TOP 1 
       a.chosendatetime 
      FROM vAnalysesHistory AS a 
      WHERE a.companyid = n.stockid 
     ORDER BY a.chosendatetime DESC) AS chosendatetime 
    FROM vStockNames AS n 

Ce qui fonctionne très bien. Maintenant, je veux étendre ce SQL. Dans la table vAnalysesHistory, il y a un attribut appelé analytique. Je voudrais seulement obtenir des lignes avec analyid = 3 par exemple.

Mon essai:

SELECT (SELECT TOP 1 
       a.id 
      FROM vAnalysesHistory AS a 
      WHERE a.companyid = n.stockid AND analyseid = 3 
     ORDER BY a.chosendatetime DESC) AS id, 
     n.name, 
     (SELECT TOP 1 
       a.chosendatetime 
      FROM vAnalysesHistory AS a 
      WHERE a.companyid = n.stockid AND analyseid = 3 
     ORDER BY a.chosendatetime DESC) AS chosendatetime 
    FROM vStockNames AS n 

Le problème est que il ny a pas des analyses avec analyseid = 3 pour chaque ligne de vStockNames. Par conséquent certaines des lignes renvoyées a null dans id et chosendatetime.

Pouvez-vous m'aider? Je ne veux lignes où il existe et avec Analysons analyseid par exemple analyseid = 3.

Et oh vous, le serveur est 2000.

Merci à l'avance

Répondre

0

j'ai utilisé une autre approche:

SELECT  B.id, C.ChosenDateTime, N.name 
FROM   (SELECT  companyid, MAX(chosendatetime) AS ChosenDateTime 
         FROM   vAnalysesHistory AS A 
         WHERE  (analyseid = 3) 
         GROUP BY companyid) AS C INNER JOIN 
         vAnalysesHistory AS B ON C.companyid = B.companyid AND C.ChosenDateTime = B.chosendatetime AND B.analyseid = 3 INNER JOIN 
         vStockNames AS N ON N.stockid = C.companyid 
ORDER BY N.name 
0

Comme il s'agit d'une colonne dérivée, vous devez inclure cette requête dans une autre requête et filtrer les résultats. Alternativement, une clause "exists" où devrait le faire:

SELECT (SELECT TOP 1 
       a.id 
      FROM vAnalysesHistory AS a 
      WHERE a.companyid = n.stockid AND analyseid = 3 
     ORDER BY a.chosendatetime DESC) AS id, 
     n.name, 
     (SELECT TOP 1 
       a.chosendatetime 
      FROM vAnalysesHistory AS a 
      WHERE a.companyid = n.stockid AND analyseid = 3 
     ORDER BY a.chosendatetime DESC) AS chosendatetime 
    FROM vStockNames AS n 
    WHERE exists (
    select 
     1 
    from 
     vAnalysesHistory 
    where 
     stockid = n.stockid 
     and analyseid = 3) 
Questions connexes