希望结果不使用子查询?

时间:2012-03-08 12:31:01

标签: sql sql-server-2008

SELECT  
   ROW_NUMBER()over(partition by tblProductTemplateHdr.product_ID 
                    order by tblProductTemplateHdr.product_ID, tblProcessSequence.sl_No) AS rno,
   tblProductTemplateHdr.product_ID
   ,tblProductProcessHdr.process_ID
   ,tblProcessSequence.sl_No    
FROM 
   Production.tblProcessSequence 
INNER JOIN 
   Production.tblProductProcessHdr ON tblProductProcessHdr.product_Process_ID = tblProcessSequence.product_Process_ID AND tblProductProcessHdr.isQC_Need = 1  
INNER JOIN 
   Production.tblProductTemplateHdr ON tblProductTemplateHdr.product_Temp_ID = tblProductProcessHdr.product_Temp_ID 

我想在每个sl_No中使用最大product_Id的行而不使用子查询,这是通过运行此查询获得的结果想要对同一查询应用过滤

image

2 个答案:

答案 0 :(得分:4)

您需要a)稍微重写一下您的查询,b)我建议您使用表别名来提高查询的可读性。

试试这个:

;WITH ProductData AS
(
  SELECT  
     ROW_NUMBER() OVER (PARTITION BY pth.Product_ID 
                        ORDER BY pth.Product_ID, ps.sl_No DESC) AS rno,
     tph.product_ID,
     tph.process_ID,
     ps.sl_No    
  FROM 
     Production.tblProcessSequence ps
  INNER JOIN 
     Production.tblProductProcessHdr pph ON tph.product_Process_ID = ps.product_Process_ID 
                                         AND pph.isQC_Need = 1  
  INNER JOIN 
     Production.tblProductTemplateHdr tph ON tph.product_Temp_ID = pph.product_Temp_ID 
)
SELECT *
FROM 
    ProductData
WHERE
    rno = 1

ROW_NUMBER()函数按Product_ID对您的数据进行分区,并在每个分区内按sl_No DESC对行进行排序 - 因此sl_No的最高值得到{{1}值(所有其他值在每个分区中获得更高的数字)

答案 1 :(得分:1)

您可以使用其他窗口函数:

MAX(tblProcessSequence.sl_No) OVER(PARTITION BY tblProductTemplateHdr.product_ID)

<强>附录

只是在上下文不明确的情况下给出完整的查询:

SELECT  ROW_NUMBER() OVER (PARTITION BY tempHdr.Product_ID  ORDER BY Seq.sl_No DESC) AS rno,
        tempHdr.product_ID,
        procHdr.process_ID,
        Seq.sl_No,
        MAX(Seq.sl_No) OVER(PARTITION BY tblProductTemplateHdr.Product_ID) AS Max_SL_No
FROM    Production.tblProcessSequence Seq
        INNER JOIN Production.tblProductProcessHdr procHdr
            ON Seq.product_Process_ID = tblProductProcessHdr.product_Process_ID 
            AND procHdr.isQC_Need = 1  
        INNER JOIN Production.tblProductTemplateHdr tempHdr
            ON tempHdr.product_Temp_ID = procHdr.product_Temp_ID