【问题标题】:Can i execute query in iif function我可以在 iif 函数中执行查询吗
【发布时间】:2011-03-05 19:35:11
【问题描述】:

我想知道我能否在 ms access 数据库中使用的 iif 函数中运行查询。我的情况

Select field1,(iif(3<4,'Select * from tbl1','select * from tbl2')) from tblmain

当我尝试执行这样的查询时遇到语法错误是什么问题

【问题讨论】:

  • 我想知道你是否简化了重要的细节,因为我使用子选择作为 IIf() 的返回参数没有任何困难。
  • 我可能是错的,因为我没有使用太多子选择,但是您的子选择不需要使用 WHERE 子句链接回您的主查询吗?如果这是问题,我会将其发布为答案...
  • 实际上,@Remi,你是对的——我没有注意到问题中的 SELECT 返回所有行和所有字段。即使只有一行和一个字段,我认为它需要更多的限制才能工作。当我设置这样的查询时,我收到错误“您编写的子查询可以在不使用 EXISTS 保留字的情况下返回多个字段...”如果我在 SELECT 中明确指定单个字段但不提供 WHERE 子句,我收到此错误:“子查询最多可以返回一条记录。”我测试了一个相关的子查询,而不是这个混乱!

标签: ms-access iif-function


【解决方案1】:

从您的示例查询中不清楚您想要实现的目标。

您可以在 Access 查询中使用 IIF 函数,例如:

SELECT IIF([SomeField]<15, "Smaller than 15", "Greater than!") As Whatever 
FROM myTable

您也可以在 Access 中使用子选择,例如(例如从 http://allenbrowne.com/subquery-01.html 无耻窃取):

SELECT MeterReading.ID, MeterReading.ReadDate, MeterReading.MeterValue, 
    (SELECT TOP 1 Dupe.MeterValue                 
     FROM MeterReading AS Dupe                     
     WHERE Dupe.AddressID = MeterReading.AddressID 
         AND Dupe.ReadDate < MeterReading.ReadDate   
     ORDER BY Dupe.ReadDate DESC, Dupe.ID) AS PriorValue 
FROM MeterReading;

请注意,必须保证指定的子选择查询返回单个记录 - 通过指定 TOP 1 或使用聚合函数 - 并且必须链接回 WHERE 子句中的父查询。

但是,即使您的子选择是有效的,但事实并非如此,您也不能按照您在问题中尝试的方式使用 IIF 语句。

建议两个选项,虽然我不太清楚你在这里想要实现什么。首先,您可能要考虑改为在 VBA 中执行此操作。比如:

const query1 As String = "Select * from tbl1"
const query2 As String = "select * from tbl2"

Dim recset as DAO.Recordset
set recset = CurrentDB.OpenRecordset(iif(3<4, query1, query2))

或者,如果 tbl1 和 tbl2 具有相同的字段,您可以执行以下操作:

SELECT * FROM tbl1 WHERE 3<4
UNION ALL
SELECT * FROM tbl2 WHERE NOT (3<4)

如果您将 3

【讨论】:

  • 其实我认为不一定是关联子查询,只要返回1个字段1行即可。当然,如果它与每一行中的数据不相关,它将为每一行返回相同的内容,您不妨使用 DLookup(),或者就此而言,在 FROM 子句中使用非 JOINED 表(在 WHERE 子句中过滤),尽管后者会使其不可编辑。
  • 很公平。感谢您的来信。
猜你喜欢
  • 1970-01-01
  • 2011-05-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-18
  • 1970-01-01
相关资源
最近更新 更多