使用MAX功能连接3个表

时间:2015-04-10 23:35:19

标签: mysql vb.net join max multiple-tables

我遇到了复杂查询的问题(至少对我而言);我用for循环完成了这个,但我想知道是否有更好的解决方案。

我有3张桌子。

表:pnmaster

  1. PN(主键)
  2. 描述
  3. 类型
  4. 表:购买

    1. PN(非主要)
    2. 数量
    3. 日期
    4. 表:消费

      1. PN(非主要)
      2. 数量
      3. 日期
      4. 我想执行一个查询,从pnmaster中选择Type =“X”的PN,并加入相应的最新买入和最新消费量以及每个PN的数量。我已经尝试了下面这段代码并且可以正常使用1个Join,但是2个挂起至少10分钟。

        SELECT pnmaster.PN,pnmaster.Description,buy.Quantity,consume.Quantity,
               MAX(consume.Date),MAX(buy.Date) FROM pnmaster 
               INNER JOIN consume ON pnmaster.PN=consume.PN 
               INNER JOIN buy ON pnmaster.PN=buy.PN WHERE(pnmaster.Type='X') 
               GROUP BY PN;
        

        示例,从pnmaster开始:

        PN Desc
        A  Seal
        B  Screw
        C  Hammer
        

        购买:

        PN Qty Date
        A   2   01/01/2013
        A   3   01/02/2014
        B   1   01/07/2011
        C   7   01/05/2014
        C   4   01/03/2012
        C   3   01/02/2013
        

        消耗:

        PN Qty Date
        A   4   01/01/2010
        A   7   01/02/2012
        B   3   01/07/2010
        C   1   01/05/2013
        C   9   01/03/2011
        C   3   01/02/2015
        

        预期结果:

        PN Desc  LastBuy LastConsume LastBuyDate LastConsumeDate
        A  Seal    3         7        01/02/2014   01/02/2012
        B  Screw   1         3        01/07/2011   01/07/2010
        C  Hammer  3         3        01/02/2013   01/02/2015
        

1 个答案:

答案 0 :(得分:0)

对此可能有更好的查询...但您可以使用:

SELECT
    m.PN
    ,m.Description
    ,(
    SELECT Quantity FROM buys WHERE Date = (
        SELECT MAX(Date) FROM buys WHERE PN = m.PN
        )
    ) AS LastBuyQty
    ,(
    SELECT MAX(Date) FROM buys WHERE PN = m.PN
    ) AS LastBuyDate
    ,(
    SELECT Quantity FROM consumes WHERE Date = (
        SELECT MAX(Date) FROM consumes WHERE PN = m.PN
        )
    ) AS LastConsumeQty
    ,(
    SELECT MAX(Date) FROM consumes WHERE PN = m.PN
    ) AS LastConsumeDate
FROM pnmaster AS m
WHERE m.PN = 'A';