【问题标题】:What is the correct MS Access SQL syntax for creating a union query创建联合查询的正确 MS Access SQL 语法是什么
【发布时间】:2020-02-05 20:20:45
【问题描述】:

Microsoft 文档指出:

CREATE VIEW view [(field1[, field2[, ...]])] AS selectstatement

并列出了一些规定。我正在尝试使用ADODB 使用CREATE VIEW 语句创建联合查询。我可以在 Access (2013) 中运行并保存联合本身(它显示它已保存为带有两个小互锁圆圈图标的联合查询)。但是 Microsoft.ACE.OLEDB.12.0 引擎抱怨Unions 不允许在子查询中使用,或者在VIEWS 中只允许简单的SELECT 查询。我需要使用DAO 还是有不同的语法?我的创建视图语句是:

uString = "CREATE VIEW vwSpendingTotals (Spending, Name) as SELECT Spending, Name FROM " & _
" (SELECT  Sum( tblA.Amount) as Spending, 'Auto' as Name from tblGeneral_Ledger  gl " & _
" inner join tblAccount_AUTO as tblA on gl.Trans_ID = tblA.Trans_ID " & _
" where gl.Debit_Credit < 0 AND Trans_Date > DateSerial(Year(Now()),1,1)  Union " & _
" SELECT  Sum( tblH.Amount) as Spending, 'Household' as Name from tblGeneral_Ledger  gl " & _
" inner join tblAccount_Household as tblH on gl.Trans_ID = tblH.Trans_ID " & _
" where gl.Debit_Credit < 0 AND Trans_Date > DateSerial(Year(Now()),1,1) union " & _
" SELECT  Sum( tblL.Amount) as Spending, 'Living' as Name from tblGeneral_Ledger  gl " & _
" inner join tblAccount_Living as tblL on gl.Trans_ID = tblL.Trans_ID " & _
" where gl.Debit_Credit < 0 AND Trans_Date > DateSerial(Year(Now()),1,1)  union " & _
" SELECT  Sum( tblM.Amount) as Spending, 'Medical' as Name from tblGeneral_Ledger  gl " & _
" inner join tblAccount_Medical as tblM on gl.Trans_ID = tblM.Trans_ID " & _
" where gl.Debit_Credit < 0 AND Trans_Date > DateSerial(Year(Now()),1,1) union " & _
" SELECT  Sum( tblP.Amount) as Spending, 'Personal' as Name from tblGeneral_Ledger  gl " & _
" inner join tblAccount_Personal as tblP on gl.Trans_ID = tblP.Trans_ID " & _
" where gl.Debit_Credit < 0 AND Trans_Date > DateSerial(Year(Now()),1,1) union " & _
" SELECT  Sum( tblU.Amount) as Spending, 'Utilities' as Name from tblGeneral_Ledger  gl " & _
" inner join tblAccount_Utilities as tblU on gl.Trans_ID = tblU.Trans_ID " & _
" where gl.Debit_Credit < 0 AND Trans_Date > DateSerial(Year(Now()),1,1)) order by Name"
objConnection.Execute uString

objConnection 已在脚本中较早地实例化。 是否应该更新 Microsoft 文档以反映 Jet 12 引擎返回的错误,还是我在找错树?

提前致谢, 哈罗德

【问题讨论】:

  • 格式(
    )?制作子查询视图以规避错误(子查询中不允许联合)!
  • 这是一个值得追求的可能性
  • 是的,这似乎是唯一可行的方法。我可以使用 ucanaccess 4.0 库和 Access Query 设计 SQL 窗口针对 Access 数据库构建和执行非常复杂的联合和相当嵌套的连接,但是在创建视图方面,Access 是一个真正的弱点。嵌套连接必须分解成一系列相互依赖的视图感谢指导

标签: sql ms-access


【解决方案1】:

您是否在子查询之后使用别名运行它:

uString = "CREATE VIEW vwSpendingTotals (Spending, Name) as SELECT Spending, Name FROM " & _
" (SELECT  Sum( tblA.Amount) as Spending, 'Auto' as Name from tblGeneral_Ledger  gl " & _
" inner join tblAccount_AUTO as tblA on gl.Trans_ID = tblA.Trans_ID " & _
" where gl.Debit_Credit < 0 AND Trans_Date > DateSerial(Year(Now()),1,1)  Union " & _
" SELECT  Sum( tblH.Amount) as Spending, 'Household' as Name from tblGeneral_Ledger  gl " & _
" inner join tblAccount_Household as tblH on gl.Trans_ID = tblH.Trans_ID " & _
" where gl.Debit_Credit < 0 AND Trans_Date > DateSerial(Year(Now()),1,1) union " & _
" SELECT  Sum( tblL.Amount) as Spending, 'Living' as Name from tblGeneral_Ledger  gl " & _
" inner join tblAccount_Living as tblL on gl.Trans_ID = tblL.Trans_ID " & _
" where gl.Debit_Credit < 0 AND Trans_Date > DateSerial(Year(Now()),1,1)  union " & _
" SELECT  Sum( tblM.Amount) as Spending, 'Medical' as Name from tblGeneral_Ledger  gl " & _
" inner join tblAccount_Medical as tblM on gl.Trans_ID = tblM.Trans_ID " & _
" where gl.Debit_Credit < 0 AND Trans_Date > DateSerial(Year(Now()),1,1) union " & _
" SELECT  Sum( tblP.Amount) as Spending, 'Personal' as Name from tblGeneral_Ledger  gl " & _
" inner join tblAccount_Personal as tblP on gl.Trans_ID = tblP.Trans_ID " & _
" where gl.Debit_Credit < 0 AND Trans_Date > DateSerial(Year(Now()),1,1) union " & _
" SELECT  Sum( tblU.Amount) as Spending, 'Utilities' as Name from tblGeneral_Ledger  gl " & _
" inner join tblAccount_Utilities as tblU on gl.Trans_ID = tblU.Trans_ID " & _
" where gl.Debit_Credit < 0 AND Trans_Date > DateSerial(Year(Now()),1,1))a order by Name"
objConnection.Execute uString

【讨论】:

  • 据我了解联合的概念,每个子查询等同于结果集中的一行,每个子查询必须包含相同数量和名称的列。给子查询起别名对于加入语句很有用,但我不确定它将如何促进联合。关键是在 Access 中,在查询设计、SQL 视图中,我可以输入上述所有 SQL 并运行并保存查询(保存为联合)并从保存的查询中查询(实际上是一个视图),但是创建视图机制不符合我的意愿。适用于 Oracle、SQLServer 等,但不适用于 MS Access
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多