【问题标题】:Combine three queries' results and use them in one another query合并三个查询的结果并在另一个查询中使用它们
【发布时间】:2018-08-08 11:11:54
【问题描述】:

我想用这三个查询:

第一个查询:

SELECT 
    AMICOS.PNRREG.PN, Max(AMICOS.HISTORYSTOCKFLOAT.HISTORYDATE) AS lastissue 
FROM 
    AMICOS.HISTORYSTOCKFLOAT 
INNER JOIN 
    AMICOS.PNRREG ON AMICOS.HISTORYSTOCKFLOAT.PARTID = AMICOS.PNRREG.PARTID 
WHERE 
    (((AMICOS.HISTORYSTOCKFLOAT.ACTION)='ISSUE') AND    
    ((AMICOS.HISTORYSTOCKFLOAT.HISTORYDATE)<to_date('31032019','DDMMYYYY')+1)) 
GROUP BY 
    AMICOS.PNRREG.PN;

第二次查询:

SELECT 
    AMICOS.PNRREG.PN, Max(AMICOS.HISTORY.HISTORYDATE) AS lastissuehistory
FROM
    AMICOS.HISTORY 
INNER JOIN 
    AMICOS.PNRREG ON AMICOS.HISTORY.PARTID = AMICOS.PNRREG.PARTID
WHERE 
   (((AMICOS.HISTORY.HISTORYACTION)='ISSUE') AND 
    ((AMICOS.HISTORY.HISTORYDATE)<to_date('31032019','DDMMYYYY')+1))
GROUP BY 
    AMICOS.PNRREG.PN;

第三次查询:

SELECT 
    AMICOS.PNRREG.PN, Max(AMICOS.HISTORYSTOCKFLOAT.HISTORYDATE) AS lastpurchase
FROM
    AMICOS.HISTORYSTOCKFLOAT 
INNER JOIN 
    AMICOS.PNRREG ON AMICOS.HISTORYSTOCKFLOAT.PARTID = AMICOS.PNRREG.PARTID
WHERE 
    (((AMICOS.HISTORYSTOCKFLOAT.HISTORYDATE)<to_date('31032019','DDMMYYYY')+1))
GROUP BY 
    AMICOS.PNRREG.PN, AMICOS.HISTORYSTOCKFLOAT.ACTION
HAVING 
    (((AMICOS.HISTORYSTOCKFLOAT.ACTION)='PURCHASE'));

最后一个查询将它们放在一起:

SELECT AMICOS.PNRREG.PN, AMICOS.IRCABCCAT.ABC_CATEGORY, AMICOS.IRC.PRIMUTILISATION, AMICOS.PNRREG.DESCRIPTION, AMICOS.HISTORYSTOCKFLOAT.ACCOUNTNO, AMICOS.HISTORYSTOCKFLOAT.HISTORYDATE, AMICOS.HISTORYSTOCKFLOAT.STOCK_FLOAT, AMICOS.HISTORYSTOCKFLOAT.STOCK_PRICE, AMICOS.HISTORYSTOCKFLOAT.STOCKVALUE, lastpurchase.lastpurchase, lastissue.lastissue, lastissuehistory.lastissuehistory
FROM ((AMICOS.PNRREG LEFT JOIN lastissuehistory ON AMICOS.PNRREG.PN = lastissuehistory.PN LEFT JOIN lastissue ON AMICOS.PNRREG.PN = lastissue.PN) 
LEFT JOIN lastpurchase ON AMICOS.PNRREG.PN = lastpurchase.PN);

我尝试了 UNION, JOIN 将这些查询放在一起,以从最后一个查询中获得一个结果,该结果依赖于其他三个查询。

当我预定义了前三个查询的查询时,它可以在 MS Access 上运行。但它不适用于 Oracle SQL Developer 查询工具。

我怎样才能做到这一点?

【问题讨论】:

    标签: sql oracle oracle11g


    【解决方案1】:

    看起来像 CTE(通用表表达式,即 WITH 因式分解子句)可能会有所帮助。像这样的:

    with 
      first  as (select pn, ... from ...),
      second as (select pn, ... from ...),
      third  as (select pn, ... from ...)
    -- now, join them
    select f.pn, s.some_column, t.some_other_column
    from first f join second s on s.pn = f.pn
    join third t on t.pn = f.pn
    

    【讨论】:

      【解决方案2】:

      您可以使用 With 或以下选项

      SELECT 
          AMICOS.PNRREG.PN, 
          AMICOS.IRCABCCAT.ABC_CATEGORY, 
          AMICOS.IRC.PRIMUTILISATION, 
          AMICOS.PNRREG.DESCRIPTION, 
          AMICOS.HISTORYSTOCKFLOAT.ACCOUNTNO, 
          AMICOS.HISTORYSTOCKFLOAT.HISTORYDATE, 
          AMICOS.HISTORYSTOCKFLOAT.STOCK_FLOAT, 
          AMICOS.HISTORYSTOCKFLOAT.STOCK_PRICE, 
          AMICOS.HISTORYSTOCKFLOAT.STOCKVALUE, 
          lastpurchase.lastpurchase, 
          lastissue.lastissue, 
          lastissuehistory.lastissuehistory
      FROM 
          AMICOS.PNRREG
      
      LEFT JOIN (SELECT 
      AMICOS.PNRREG.PN, 
      Max(AMICOS.HISTORY.HISTORYDATE) AS lastissuehistory
      FROM 
          AMICOS.HISTORY 
          INNER JOIN AMICOS.PNRREG ON AMICOS.HISTORY.PARTID = AMICOS.PNRREG.PARTID
      WHERE (((AMICOS.HISTORY.HISTORYACTION)='ISSUE') AND ((AMICOS.HISTORY.HISTORYDATE)<to_date('31032019','DDMMYYYY')+1))
      GROUP BY AMICOS.PNRREG.PN) lastissuehistory ON AMICOS.PNRREG.PN = lastissuehistory.PN 
      
      LEFT JOIN (SELECT 
      AMICOS.PNRREG.PN, 
      Max(AMICOS.HISTORYSTOCKFLOAT.HISTORYDATE) AS lastissue 
      FROM 
          AMICOS.HISTORYSTOCKFLOAT 
          INNER JOIN AMICOS.PNRREG ON AMICOS.HISTORYSTOCKFLOAT.PARTID = AMICOS.PNRREG.PARTID 
      WHERE 
      (((AMICOS.HISTORYSTOCKFLOAT.ACTION)='ISSUE') AND ((AMICOS.HISTORYSTOCKFLOAT.HISTORYDATE)<to_date('31032019','DDMMYYYY')+1)) 
      GROUP BY AMICOS.PNRREG.PN)lastissue ON AMICOS.PNRREG.PN = lastissue.PN
      
      LEFT JOIN (SELECT 
          AMICOS.PNRREG.PN, 
          Max(AMICOS.HISTORYSTOCKFLOAT.HISTORYDATE) AS lastpurchase
      FROM 
          AMICOS.HISTORYSTOCKFLOAT 
          INNER JOIN AMICOS.PNRREG ON AMICOS.HISTORYSTOCKFLOAT.PARTID = AMICOS.PNRREG.PARTID
      WHERE (((AMICOS.HISTORYSTOCKFLOAT.HISTORYDATE)<to_date('31032019','DDMMYYYY')+1))
      GROUP BY AMICOS.PNRREG.PN, AMICOS.HISTORYSTOCKFLOAT.ACTION
      HAVING (((AMICOS.HISTORYSTOCKFLOAT.ACTION)='PURCHASE'))) lastpurchase ON AMICOS.PNRREG.PN = lastpurchase.PN
      

      【讨论】:

      • 这有错误,它找不到表:AMICOS.PNRREG.PN, AMICOS.IRCABCCAT.ABC_CATEGORY, AMICOS.IRC.PRIMUTILISATION, AMICOS.PNRREG.DESCRIPTION, AMICOS.HISTORYSTOCKFLOAT.ACCOUNTNO, AMICOS.HISTORYSTOCKFLOAT.HISTORYDATE, AMICOS.HISTORYSTOCKFLOAT.STOCK_FLOAT, AMICOS.HISTORYSTOCKFLOAT.STOCK_PRICE, AMICOS.HISTORYSTOCKFLOAT.STOCKVALUE 不知何故.. 但我会用 WITH 试试这个。问候 Erneeraq
      • 尝试替换三个左连接字段AMICOS.PNRREG.PN,historystockfloat表中有PN字段吗?如果是,则更新它并更新组
      【解决方案3】:

      @Littlefoot 我试过这样的事情:

      WITH
      first as (SELECT AMICOS.PNRREG.PN, Max(AMICOS.HISTORYSTOCKFLOAT.HISTORYDATE) AS lastissue FROM AMICOS.HISTORYSTOCKFLOAT INNER JOIN AMICOS.PNRREG ON                   AMICOS.HISTORYSTOCKFLOAT.PARTID = AMICOS.PNRREG.PARTID WHERE (((AMICOS.HISTORYSTOCKFLOAT.ACTION)='ISSUE') AND                                           ((AMICOS.HISTORYSTOCKFLOAT.HISTORYDATE)<to_date('31032019','DDMMYYYY')+1)) GROUP BY AMICOS.PNRREG.PN),
      second as (SELECT AMICOS.PNRREG.PN, Max(AMICOS.HISTORY.HISTORYDATE) AS lastissuehistory
             FROM AMICOS.HISTORY INNER JOIN AMICOS.PNRREG ON AMICOS.HISTORY.PARTID = AMICOS.PNRREG.PARTID
             WHERE (((AMICOS.HISTORY.HISTORYACTION)='ISSUE') AND ((AMICOS.HISTORY.HISTORYDATE)<to_date('31032019','DDMMYYYY')+1))
             GROUP BY AMICOS.PNRREG.PN),
      third as (SELECT AMICOS.PNRREG.PN, Max(AMICOS.HISTORYSTOCKFLOAT.HISTORYDATE) AS lastpurchase
      FROM AMICOS.HISTORYSTOCKFLOAT INNER JOIN AMICOS.PNRREG ON AMICOS.HISTORYSTOCKFLOAT.PARTID = AMICOS.PNRREG.PARTID
      WHERE (((AMICOS.HISTORYSTOCKFLOAT.HISTORYDATE)<to_date('31032019','DDMMYYYY')+1))
      GROUP BY AMICOS.PNRREG.PN, AMICOS.HISTORYSTOCKFLOAT.ACTION
      HAVING (((AMICOS.HISTORYSTOCKFLOAT.ACTION)='PURCHASE')))
      SELECT AMICOS.PNRREG.PN, AMICOS.IRCABCCAT.ABC_CATEGORY, AMICOS.IRC.PRIMUTILISATION,
      AMICOS.PNRREG.DESCRIPTION, AMICOS.HISTORYSTOCKFLOAT.ACCOUNTNO,
      AMICOS.HISTORYSTOCKFLOAT.HISTORYDATE, AMICOS.HISTORYSTOCKFLOAT.STOCK_FLOAT,
      AMICOS.HISTORYSTOCKFLOAT.STOCK_PRICE, AMICOS.HISTORYSTOCKFLOAT.STOCKVALUE,
      lastpurchase.lastpurchase, lastissue.lastissue, lastissuehistory.lastissuehistory
      FROM ((AMICOS.PNRREG LEFT JOIN lastpurchase ON AMICOS.PNRREG.PN = lastpurchase.PN
      LEFT JOIN lastissue ON AMICOS.PNRREG.PN = lastissue.PN) LEFT JOIN lastissuehistory ON
      AMICOS.PNRREG.PN = lastissuehistory.PN;
      

      但它一直告诉我“选择列表与 GROUP BY 不一致;将 GROUP BY 子句修改为:AMICOS.PNRREG.PN, AMICOS.HISTORYSTOCKFLOAT.ACTION, Max(AMICOS.HISTORYSTOCKFLOAT.HISTORYDATE)”

      问候 厄尼拉克

      【讨论】:

        【解决方案4】:

        在本指南的帮助下,我设法完成了这项工作:Use lookupset function in SSRS

        Katherine Xiong 的一个建议。

        问候

        厄尼拉克

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2019-04-05
          • 2015-09-12
          • 1970-01-01
          • 2016-04-06
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多