MS Access 将我的列/别名视为参数......但只是有时

Posted

技术标签:

【中文标题】MS Access 将我的列/别名视为参数......但只是有时【英文标题】:MS Access treats my column/alias as a parameter... But only sometimes 【发布时间】:2018-02-07 20:16:41 【问题描述】:

SQL 新手,但我相当确定我的查询是正确的。我已经尝试了上千种不同的方法,但它有时仍会将我的列/别名lead_ID_t 视为参数。我已将方括号括在所有内容中以试图提供帮助,但无济于事...

我在 notepad++ 中编辑查询,当我将它粘贴到 Access 中时,它运行得很好。然后我保存并关闭查询。当我尝试再次运行它时,它会将lead_ID_t 视为参数,并且我的格式完全消失了......谁能解释发生了什么?

SELECT [Total].[lead_ID_t] AS [Lead ID], 

IIF(isnull([Total].[lead_count_t]-[F9].[lead_count_f]),0,[Total].[lead_count_t]-[F9].[lead_count_f]) AS [V Calls]

FROM (SELECT DISTINCT [Lead_ID] AS [lead_ID_t], Count([Lead_ID]) AS [lead_count_t] 

FROM (SELECT * FROM [Logs] WHERE [log_actor] <> "Five9 Dialer") As [TData] GROUP BY [Lead_ID])  AS [Total] 

LEFT JOIN (SELECT DISTINCT [Lead_ID] AS [Lead_ID_f], count([Lead_ID]) AS [lead_count_f] 

FROM (SELECT * FROM [Logs] WHERE [log_actor] = "Five9 Dialer") As [FData] GROUP BY [Lead_ID])  AS [F9] ON [Total].[lead_ID_t]=[F9].[lead_ID_f];

ps。使用和不使用 iif 语句都会发生同样的错误

【问题讨论】:

这是什么意思它将lead_ID_t视为参数?它会提示您输入参数吗?而且 MS Access 既不保存查询格式也不漂亮地打印它! @Parfait 是的,这就是我的意思。这真的很不幸......使得在应用程序中编辑长查询几乎是不可能的。 :( 它会弹出询问 SELECT 列表中它无法识别的任何列的值。因此,由于某种原因,它无法识别列名。该列名来自子查询。也许不是对问题的正确答案(这可能是一个错误) - 您可以将子查询移动到另一个查询吗? 【参考方案1】:

考虑一个调整后的紧凑查询:

    删除冗余嵌套级别,因为您可以在聚合 GROUP BY 查询中使用 WHERE

    删除 DISTINCT,因为聚合查询已经返回不同的分组值。

    IIF()(为NULL 返回零的语句)替换为NZ()

    虽然 Total 可能不是列出的 MS Access 或 JET 保留字,但它可能是 GUI 应用程序保留字,从而导致问题。使用以前的子查询别名,TDataFData

    或者,对一个没有子查询或联接的主查询使用条件聚合,并且可以使用计算列来避免重复。

紧凑查询

SELECT [TData].[lead_ID_t] AS [Lead ID],
       NZ(([TData].[lead_count_t] - [FData].[lead_count_f]),0) AS [V Calls]
FROM
  (SELECT [Lead_ID] AS [lead_ID_t],
          COUNT([Lead_ID]) AS [lead_count_t]
   FROM [Logs]
   WHERE [log_actor] <> 'Five9 Dialer'
   GROUP BY [Lead_ID]) AS [TData]

LEFT JOIN    
  (SELECT [Lead_ID] AS [Lead_ID_f],
          COUNT([Lead_ID]) AS [lead_count_f]
   FROM [Logs]
   WHERE [log_actor] = 'Five9 Dialer' 
   GROUP BY [Lead_ID]) AS [FData]

ON [TData].[lead_ID_t] = [FData].[lead_ID_f];

条件聚合

SELECT l.[Lead ID],
       SUM(IIF(l.[log_actor] <> 'Five9 Dialer', 1, 0)) AS [lead_count_t],
       SUM(IIF(l.[log_actor] = 'Five9 Dialer', 1, 0)) AS [lead_count_f],
       NZ(([lead_count_t] - [lead_count_f]),0) AS [V Calls]
FROM [Logs] l
GROUP BY l.[Lead_ID]

【讨论】:

像宝石一样工作,没想到我可以使用条件聚合,谢谢! 很高兴听到并乐于提供帮助!

以上是关于MS Access 将我的列/别名视为参数......但只是有时的主要内容,如果未能解决你的问题,请参考以下文章

如何在 ms Access 报告中使用别名

如何在 Access SQL 的列别名中使用表名?

使用 c# 和 oledb 查询更新 Ms-Access 2010 中的列值

使用 C# 动态重命名 MS Access 中的列

MS Access 2010 中的列数?

MS-Access 按具有 count(*) > 1 奇怪行为的列分组?