2017-10-06 85 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 和...等

有什麼不對呢?