【问题标题】:Query too complex查询太复杂
【发布时间】:2012-08-18 18:33:19
【问题描述】:

我正在尝试将一些计算从 Excel 移到我的 Access 数据库中,但是当我使用 5 个以上的输入值时,我遇到了“查询太复杂”错误。我应该拆分查询还是有更有效的解决方法?任何帮助,将不胜感激!代码如下:

SELECT qb1.CompanyName, qb1.Assetname, qb1.Year,
      ((qb1.DatapointValue*1000000)+qb2.DatapointValue+
        qb3.DatapointValue+qb4.DatapointValue+qb5.DatapointValue+
        qb6.DatapointValue) AS MPPOilRevised

FROM ((((((PEBaseQuery AS qb1 
INNER JOIN PEBaseQuery AS qb2 ON qb1.AssetName=qb2.AssetName) 
INNER JOIN PEBaseQuery AS qb3 ON qb1.AssetName=qb3.AssetName) 
INNER JOIN PEBaseQuery AS qb4 ON qb1.AssetName=qb4.AssetName) 
INNER JOIN PEBaseQuery AS qb5 ON qb1.AssetName=qb5.AssetName) 
INNER JOIN PEBaseQuery AS qb6 ON qb1.AssetName=qb6.AssetName))

WHERE qb1.DatapointID=2003 And qb2.DatapointID=2032 
      And qb3.DatapointID=2034 And qb4.DatapointID=2042 
      And qb5.DatapointID=2036 And qb6.DatapointID=2030;

CompanyName, Year, AssetName, DatapointID, DatapointName,   DatapointValue 
CompanyA,    2011, CAAsset1,  2005,        OIL,             170883.740972926 
CompanyA,    2011, CAAsset1,  2032,        Wellwork,        615913 
CompanyA,    2011, CAAsset1,  2034,        Annual shutdown, 0 
CompanyA,    2011, CAAsset1,  2042,        Export,          0 
CompanyA,    2011, CAAsset1,  2036,        Plant,           958387 
CompanyA,    2011, CAAsset1,  2030,        Reservoir,       2394231 

【问题讨论】:

  • 尝试将qbX.DatapointValue 操作数展平为(SELECT qbX.DatapointValue FROM ... WHERE.... ) AS ExprX
  • 一些单独的问题..为什么第一个 DatapointValue 需要乘以 1000000?它看起来很奇怪,因为这些值来自一列。我认为没有它可以让整个查询变得更加简单。
  • 乘以一百万是因为我需要每百万桶石油的价值

标签: sql ms-access-2010


【解决方案1】:

看起来您需要一个聚合查询,而不是这个复杂的查询。例如

select companyName, assetName, year, 
   Sum(DatapointValue) as MPPOilRevised
from PEBaseQuery 
where DatapointID in (2032, 2034, 2042, 2036)
group by companyName, assetName, year

唯一的问题是第一个数据点乘以 1000000。你可以试试IIF

select companyName, assetName, year, 
   Sum(IIf(DatapointID=2003,DatapointValue*1000000,DatapointValue)) as MPPOilRevised
from PEBaseQuery 
where DatapointID in (2032, 2034, 2042, 2036)
group by companyName, assetName, year

另外请尝试这种“疯狂”的查询,对这个特定的 DatapointID 进行子查询,没有IIF

select companyName, assetName, year, SUM(DatapointValue) 
        + (select SUM(DatapointValue * 1000000) from  PEBaseQuery q2 
           where q2.companyName = q1.companyName 
              and q2.assetName= q1.assetName
              and q2.year= q1.year
              and q2.DatapointID = 2003
           group by companyName, assetName, year)
    from PEBaseQuery q1
    where DatapointID in (2032, 2034, 2042, 2036)
    group by companyName, assetName, year

“生产最大潜力”更新。请尝试以下操作:

select b.companyName, b.assetName, IIf(b.calculationResult > mp.calculationResult,b.calculationResult,mp.calculationResult)  as MPPOilRevised
from 
    (select companyName, assetName, year, Sum(IIf(DatapointID=2003,DatapointValue*1000000,DatapointValue)) as calculationResult
        from PEBaseQuery 
        where DatapointID in (2032, 2034, 2042, 2036) 
        group by companyName, assetName, year) b --Base
     left join 
     (select companyName, assetName, year, 
        Sum(DatapointValue) as calculationResult
        from PEBaseQuery 
        where DatapointID = 2218
        group by companyName, assetName, year) mp -- Max Potential
    on b.companyName= mp.companyName
        and b.assetName = mp.assetName
        and b.year = mp.year

使用减法逻辑的计算示例。 更新最终疯狂的 SQL。另请注意,对于此类事情,我会使用应用程序逻辑或存储过程:

    select b.companyName, b.assetName, IIf(b.calculationResult > mp.calculationResult,b.calculationResult,mp.calculationResult)  as MPPOilRevised
from 
    (select companyName, assetName, year, SUM(DatapointValue) 
        + (select SUM(DatapointValue * 1000000) from  PEBaseQuery q2 
           where q2.companyName = q1.companyName 
              and q2.assetName= q1.assetName
              and q2.year= q1.year
              and q2.DatapointID = 2003
           group by companyName, assetName, year)
        - (select SUM(DatapointValue) from  PEBaseQuery q2 
           where q2.companyName = q1.companyName 
              and q2.assetName= q1.assetName
              and q2.year= q1.year
              and q2.DatapointID = 2029 
           group by companyName, assetName, year)
    from PEBaseQuery q1
    where DatapointID in (2032, 2034, 2042, 2036)
    group by companyName, assetName, year) b --Base
     left join 
     (select companyName, assetName, year, 
        Sum(DatapointValue) as calculationResult
        from PEBaseQuery 
        where DatapointID = 2218
        group by companyName, assetName, year) mp -- Max Potential
    on b.companyName= mp.companyName
        and b.assetName = mp.assetName
        and b.year = mp.year

【讨论】:

  • 我认为您可以添加 IIf 进行乘法运算。
  • 我尝试了上面的代码并进行了更正(DatapointID = '2003', DatapointValue*1000000, DatapointValue),但它显示“标准表达式中的数据类型不匹配”
  • 应该是Sum(IIf(DatapointID=2003,DatapointValue*1000000,DatapointValue)) AS
  • 已根据此更正进行更新,谢谢。还添加了一个变体,类似的适用于 Oracle。
  • 非常感谢您的帮助!两个版本都有效:) 我可能在这里碰运气,但我还有另一个问题.. 我需要将其合并到 IF 语句中来说明,如果 DatapointID 2218(最大生产潜力)的 DatapointValue 小于上述结果计算,则 MPPOilRevised = 计算值,否则 MPPOilRevised = 2218的值
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-28
  • 1970-01-01
  • 2017-05-10
  • 2014-11-06
  • 2011-06-08
相关资源
最近更新 更多