2017-10-06 86 views
2

我在SQL Server中有一个工作查询,但我无法将其转换为MS Access SQL。T-SQL到MS Access SQL

这是在SQL Server中的裸工作查询:

select tblKPIData.id 
     ,tblKPIData.KPI_id 
     ,tblKPI.KPI_Name 
     ,tblKPIData.ImportTimestamp 
     ,tblKPIData.Quantity 
     ,tblKPIData.FinancialMonth 
     ,tblKPIData.FinancialYear 
     ,tblKPIData.Zone_id 
     ,tblZone.ZoneName 
     ,tblKPIData.DMA_id 
     ,tblDMA.DMA_Name 
     ,tblKPIData.TargetOrResult 
from tblKPIData 
inner join tblKPI 
on tblKPI.Id = KPI_id 
left outer join tblDMA 
on tblDMA.Id = tblKPIData.DMA_id 
left outer join tblZone 
on tblZone.ID = tblKPIData.Zone_id 
inner join tblDashboardKPI 
on tblDashboardKPI.KPI_Id = tblKPIData.KPI_id 
inner join 
( select a.kpi_id 
      ,a.financialMonth 
      ,a.financialYear 
      ,isnull(a.zone_id,0) as zone_id 
      ,isnull(a.dma_id,0) as dma_id 
      ,a.targetorresult 
      ,max(a.importtimestamp) as importtimestamp 
    from tblKPIData a 
    group by kpi_id 
    ,financialMonth 
    ,financialYear 
    ,zone_id 
    ,dma_id 
    ,targetorresult) as max_kpi 
on (tblKPIData.KPI_id = max_kpi.KPI_id 
and tblKPIData.ImportTimestamp = max_kpi.importtimestamp 
and tblKPIData.FinancialMonth = max_kpi.FinancialMonth 
and tblKPIData.FinancialYear = max_kpi.FinancialYear 
and isnull(tblKPIData.Zone_id,0) = isnull(max_kpi.zone_id,0) 
and isnull(tblKPIData.DMA_id,0) = isnull(max_kpi.dma_id,0) 
and tblKPIData.TargetOrResult = max_kpi.TargetOrResult) 
where tblKPIData.FinancialMonth = 'Oct' 
and tblKPIData.FinancialYear = 2017 
and tblKPIData.KPI_id in (select kpi_id from tblDashboardKPI where tblDashboardKPI.KPI_Id = tblKPIData.KPI_id) 
and (tblKPIData.Zone_id = 5 or tblKPIData.DMA_id in (select id from tblDMA where Zoneid = 5)) 
AND ((tblDashboardKPI.Status) = 1) 
and ((tblDashboardKPI.Dashboard_Id) = 6) 

我知道我必须要加上括号,但不完全知道在哪里。这是我想出了,但我得到一个错误(加入表达不支持),它highlites一段代码在第一个连接(tblKPI.Id = KPI_id):

select tblKPIData.id 
     ,tblKPIData.KPI_id 
     ,tblKPI.KPI_Name 
     ,tblKPIData.ImportTimestamp 
     ,tblKPIData.Quantity 
     ,tblKPIData.FinancialMonth 
     ,tblKPIData.FinancialYear 
     ,tblKPIData.Zone_id 
     ,tblZone.ZoneName 
     ,tblKPIData.DMA_id 
     ,tblDMA.DMA_Name 
     ,tblKPIData.TargetOrResult 
from (((((tblKPIData 
inner join tblKPI 
on tblKPI.Id = KPI_id) 
left outer join tblDMA 
on tblDMA.Id = tblKPIData.DMA_id) 
left outer join tblZone 
on tblZone.ID = tblKPIData.Zone_id) 
inner join tblDashboardKPI 
on tblDashboardKPI.KPI_Id = tblKPIData.KPI_id) 
inner join 
( select a.kpi_id 
      ,a.financialMonth 
      ,a.financialYear 
      ,isnull(a.zone_id,0) as zone_id 
      ,isnull(a.dma_id,0) as dma_id 
      ,a.targetorresult 
      ,max(a.importtimestamp) as importtimestamp 
    from tblKPIData a 
    group by kpi_id 
    ,financialMonth 
    ,financialYear 
    ,zone_id 
    ,dma_id 
    ,targetorresult) as max_kpi 
on (tblKPIData.KPI_id = max_kpi.KPI_id) 
and tblKPIData.ImportTimestamp = max_kpi.importtimestamp 
and tblKPIData.FinancialMonth = max_kpi.FinancialMonth 
and tblKPIData.FinancialYear = max_kpi.FinancialYear 
and isnull(tblKPIData.Zone_id,0) = isnull(max_kpi.zone_id,0) 
and isnull(tblKPIData.DMA_id,0) = isnull(max_kpi.dma_id,0) 
and tblKPIData.TargetOrResult = max_kpi.TargetOrResult) 
where tblKPIData.FinancialMonth = 'Oct' 
and tblKPIData.FinancialYear = 2017 
and tblKPIData.KPI_id in (select kpi_id from tblDashboardKPI where tblDashboardKPI.KPI_Id = tblKPIData.KPI_id) 
and (tblKPIData.Zone_id = 5 or tblKPIData.DMA_id in (select id from tblDMA where Zoneid = 5)) 
AND ((tblDashboardKPI.Status) = 1) 
and ((tblDashboardKPI.Dashboard_Id) = 6) 

我在做什么错?

+1

没有按访问不了解OUTER JOIN语法。通常情况下,您可以使用LEFT JOIN离开。 – jleach

+1

您需要从tblKPIData内部连接tblKPI上tblKPI.Id = tblKPIData.KPI_id'访问将接受左连接! –

+1

on(tblKPIData.KPI_id = max_kpi.KPI_id)< - 您还必须删除这个括号 – jetblack

回答

0

所以用这个查询(仍然在SQL Server的工作:

select tblKPIData.id 
     ,tblKPIData.KPI_id 
     ,tblKPI.KPI_Name 
     ,tblKPIData.ImportTimestamp 
     ,tblKPIData.Quantity 
     ,tblKPIData.FinancialMonth 
     ,tblKPIData.FinancialYear 
     ,tblKPIData.Zone_id 
     ,tblZone.ZoneName 
     ,tblKPIData.DMA_id 
     ,tblDMA.DMA_Name 
     ,tblKPIData.TargetOrResult 
from ((((tblKPIData 
inner join tblKPI 
on tblKPI.Id = tblKPIData.KPI_id) 
left join tblDMA 
on tblDMA.Id = tblKPIData.DMA_id) 
left join tblZone 
on tblZone.ID = tblKPIData.Zone_id) 
inner join tblDashboardKPI 
on tblDashboardKPI.KPI_Id = tblKPIData.KPI_id) 
inner join 
( select a.kpi_id 
      ,a.financialMonth 
      ,a.financialYear 
      ,isnull(a.zone_id,0) as zone_id 
      ,isnull(a.dma_id,0) as dma_id 
      ,a.targetorresult 
      ,max(a.importtimestamp) as importtimestamp 
    from tblKPIData a 
    group by kpi_id 
    ,financialMonth 
    ,financialYear 
    ,zone_id 
    ,dma_id 
    ,targetorresult) as max_kpi 
on (tblKPIData.KPI_id = max_kpi.KPI_id 
and tblKPIData.ImportTimestamp = max_kpi.importtimestamp 
and tblKPIData.FinancialMonth = max_kpi.FinancialMonth 
and tblKPIData.FinancialYear = max_kpi.FinancialYear 
and isnull(tblKPIData.Zone_id,0) = isnull(max_kpi.zone_id,0) 
and isnull(tblKPIData.DMA_id,0) = isnull(max_kpi.dma_id,0) 
and tblKPIData.TargetOrResult = max_kpi.TargetOrResult) 
where tblKPIData.FinancialMonth = 'Oct' 
and tblKPIData.FinancialYear = 2017 
and tblKPIData.KPI_id in (select kpi_id from tblDashboardKPI where tblDashboardKPI.KPI_Id = tblKPIData.KPI_id) 
and (tblKPIData.Zone_id = 5 or tblKPIData.DMA_id in (select id from tblDMA where Zoneid = 5)) 
AND ((tblDashboardKPI.Status) = True) 
and ((tblDashboardKPI.Dashboard_Id) = 6) 

我得到这个错误: 与查询表达功能“tblKPIData.KPI_Id = max_kpi.KPI_id 和tblKPIData使用的参数个数错误。 ImportTimestamp = max_kpi.importtimestamp 和tblKPIData.FinancialMonth = max_kpi.FinancialMonth 和...等

有什么不对呢?