使用内部联接扩展长SQL(server 2000)

使用内部联接扩展长SQL(server 2000),sql,sql-server,Sql,Sql Server,最近,stackoverflow上一位非常友好的用户帮助我使用以下SQL: 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

最近,stackoverflow上一位非常友好的用户帮助我使用以下SQL:

 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 
这很有效。现在我想扩展这个SQL。在vAnalysesHistory表中有一个名为analyseid的属性。例如,我只想获取analyseid=3的行

我的尝试:

 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 
问题在于,vStockNames中的每一行都没有analyseid=3的分析。因此,返回的某些行的id和chosendatetime为null

你能帮我吗?我只想要存在的行,并使用analyseid进行分析,例如analyseid=3

哦,是的,服务器是2000


提前感谢

我使用了另一种方法:

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

由于它是一个派生列,您需要将此查询包装到另一个查询中,并过滤结果。或者,一个“exists”where子句应该这样做:

    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)