--try
SELECT P.PurchaseOrderId, O.Status AS POStatus, O.PONumber
FROM 
(
SELECT distinct  b.PurchaseOrderId
FROM view_SaleContract_ProductTableItem_SN AS a ,
      view_PurchaseOrder_ProductTableItem_SN AS b where (a.SN = b.SN AND 
      a.ProductID = b.ProductID AND a.IsService = 0) OR
      (a.IsService = 1 AND a.LinkItemSN = b.LinkItemSN AND 
      a.LinkItemProductID = b.LinkItemProductID ) and
 SaleContractId = ? AND b.TableStatus = 3) P LEFT OUTER JOIN
      dbo.PurchaseOrder O ON P.PurchaseOrderId = O.ID
WHERE (P.PurchaseOrderId IS NOT NULL)
ORDER BY O.PONumber

解决方案 »

  1.   

    谢谢上位老兄,不过你的这种连接方法和inner join 没什么区别的,老版本的sSQL连接是这样写的,也就是如果这种sSQL语句优化应该考虑什么问题?
      

  2.   

    我优化成这样但,还是慢
    SELECT P.PurchaseOrderId, O.Status AS POStatus, O.PONumber
    FROM (
    SELECT a.SaleContractId, b.PurchaseOrderId
    FROM (SELECT SN,ProductID,SaleContractId
            FROM view_SaleContract_ProductTableItem_SN
            WHERE SaleContractId = 3986 AND IsService = 0) AS a inner JOIN
              (SELECT SN,ProductID,PurchaseOrderId
             FROM view_PurchaseOrder_ProductTableItem_SN
             WHERE TableStatus = 3) AS b ON (a.SN = b.SN AND 
          a.ProductID = b.ProductID)
    UNION
    SELECT a.SaleContractId, b.PurchaseOrderId
    FROM (SELECT SaleContractId,ServiceTimeFrom,ServiceTimeTo,LinkItemSN,LinkItemProductID 
            FROM view_SaleContract_ProductTableItem_SN
            WHERE SaleContractId = 3986 AND IsService = 1) AS a inner JOIN
              (SELECT PurchaseOrderId,ServiceTimeFrom,ServiceTimeTo,LinkItemSN,LinkItemProductID 
             FROM view_PurchaseOrder_ProductTableItem_SN
             WHERE TableStatus = 3) AS b ON 
          (a.ServiceTimeFrom <= b.ServiceTimeFrom AND 
          a.ServiceTimeTo >= b.ServiceTimeTo AND a.LinkItemSN = b.LinkItemSN AND 
          a.LinkItemProductID = b.LinkItemProductID)) P LEFT OUTER JOIN
          dbo.PurchaseOrder O ON P.PurchaseOrderId = O.ID
    ORDER BY O.PONumber
      

  3.   

    ding上去,还没有人回答我呢!