2015-10-15 66 views
-2

我正在處理SQL查詢,並且卡住了。在一個查詢中有問題的子查詢

查詢結果應包含列如下:

  • ItemCode(這是唯一產品編號)
  • LatestReceiptDate(這是ItemCode的最新簽收日期爲準)
  • LatestIssueDate(ItemCode的最新發布日期)

我試圖在主查詢中使用子查詢,但結果我在LatestIssueDateLatestReceiptdate的每一行中得到了相同的日期

就像這個...

Select Distinct 
    I.ItemCode, 
    LatestReceiptDate = (Select top 1 (MH.MoveDate) 
         from inItem as I 
         left join InMoveLn as ML on I.ItemID = ML.ItemID 
         inner join InMoveHd as MH on ML.InvMoveID = MH.InvMoveID 
         where Mh.transactiontypeID like '5001' 
         Order by Itemcode desc), 
    LatestIssueDate = (Select top 1 (MH.MoveDate) 
         From inItem as I 
         left join InMoveLn as ML on I.ItemID = ML.ItemID 
         inner join InMoveHd as MH on ML.InvMoveID = MH.InvMoveID 
         where Mh.transactiontypeID like 
     '5013' 
          or Mh.transactiontypeID like '5003' 
         Order by ItemCode desc) 
from 
    initemstore as S 
left join 
    initem as I on I.ItemId = S.ItemID 
left join 
    inMoveLn as ML on ML.ItemID = S.ItemID 
inner join 
    inMoveHd as MH on ML.InvMoveID=MH.InvMoveID 
order by 
    I.Itemcode 

我花了幾個小時,不能再往前走。我感謝所有幫助

這是我從使用上面的查詢得到

ItemCode LatestReceiptDate   LatestIssueDate 
100001 2011-09-12 15:26:18.000 2015-04-14 09:49:07.627 
100002 2011-09-12 15:26:18.000 2015-04-14 09:49:07.627 
100003 2011-09-12 15:26:18.000 2015-04-14 09:49:07.627 
100004 2011-09-12 15:26:18.000 2015-04-14 09:49:07.627 
100005 2011-09-12 15:26:18.000 2015-04-14 09:49:07.627 
+0

你不必使用「top 1」來檢索每個ItemCode的最後日期。這樣,你總是檢索所有表格的最後日期。 您必須使用「MAX(MH.MoveDate)」和「GROUP BY ItemCode」子句來獲取每組ItemCode的最後日期。 –

+0

我試過MAX但收到錯誤:子查詢返回的值超過1。當子查詢遵循=,!=,<, <= , >,> =或當子查詢用作表達式時,這是不允許的。 – Brunoxp

+0

子查詢返回具有相同MAX值的所有行。將DISTINCT子句添加到子查詢中。 –

回答

0

你的查詢比較複雜,包含在結果集中沒有其他領域的表的連接。假設它是正確的無論如何,你可以這樣寫:

WITH lrd (ItemCode, LatestReceiptDate) 
     AS (
      SELECT ItemCode, MAX(MH.MoveDate) 
      FROM inItem AS I 
      LEFT JOIN InMoveLn AS ML ON I.ItemID = ML.ItemID 
      INNER JOIN InMoveHd AS MH ON ML.InvMoveID = MH.InvMoveID 
      WHERE MH.transactiontypeID LIKE '5001' 
      GROUP BY ItemCode 
      ), 
     lid (ItemCode, LatestIssueDate) 
     AS (
      SELECT ItemCode, MAX(MH.MoveDate) 
      FROM inItem AS I 
      LEFT JOIN InMoveLn AS ML ON I.ItemID = ML.ItemID 
      INNER JOIN InMoveHd AS MH ON ML.InvMoveID = MH.InvMoveID 
      WHERE MH.transactiontypeID LIKE '5013' OR 
        MH.transactiontypeID LIKE '5003' 
      GROUP BY ItemCode 
      ) 
    SELECT 
DISTINCT I.ItemCode, lrd.LatestReceiptDate, lid.LatestIssueDate 
    FROM initemstore AS S 
    LEFT JOIN initem AS I ON I.ItemId = S.ItemID 
    LEFT JOIN inMoveLn AS ML ON ML.ItemID = S.ItemID 
    INNER JOIN inMoveHd AS MH ON ML.InvMoveID = MH.InvMoveID 
    INNER JOIN lrd ON I.ItemCode = lrd.ItemCode 
    INNER JOIN lid ON I.ItemCode = lid.ItemCode 
    ORDER BY I.Itemcode; 
+0

這工作正常,但它顯示除null之外的所有日期。我們可以修復它嗎? – Brunoxp

+0

是的,你可以。你的SQL相當複雜。也許你應該使用SqlFiddle並提供一些示例數據以及你想實現的內容。 –

+0

切廷巴索斯 - 我設法得到空 - 只是改變了內部聯接左加入'。非常感謝你的幫助。我很感激 – Brunoxp