2015-10-15 64 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