【问题标题】:Adding a Constant Row Result to SQL Query - MS Access将常量行结果添加到 SQL 查询 - MS Access
【发布时间】:2012-06-16 11:05:48
【问题描述】:

假设我有一个表“tblItems”:

*ID*    |     *Name*
1       |   First Item
2       |  Second Item

我希望将其填充到表单的下拉列表中。我将如何添加一行:

ALL     |    SHOW ALL

成为

*ID*    |     *Name*
1       |   First Item
2       |  Second Item
ALL     |    SHOW ALL

在组合框的Row Source 中放置一个查询?我一直无法找到执行此操作的 Access 语法..

AFAIK,我需要类似于

的语法
SELECT ID, Name FROM tblItems
UNION
SELECT 0, "All" FROM SOME.SYSTEM.DUMMY.TABLE

我找不到的是那个虚拟表的 Access 版本。我真的不想有一个单独的表来存储一个表格的一行......但从我一直在阅读的内容来看,我可能不得不这样做。

【问题讨论】:

  • 使用同一个表是否比创建单行虚拟表并引用它更快?您展示了对查询的两个部分使用相同的TableA,但是如果 TableA 很大,使用专用的虚拟表是否更有效?
  • 您可以选择任何保证不被删除的表。但是,我不认为一个很大的表适合组合框,所以这似乎有点理论。
  • 不是组合框的输出会很大,因为有基于其他材料的 WHERE 子句,但表可能超过 1000 个条目。仅使用 Union 来返回我的常量时,这会影响性能吗?

标签: sql ms-access dummy-data


【解决方案1】:

你可以这样做:

select ID, Name
from tblItems
union all
select 'ALL', 'SHOW ALL'

如果您总是希望它显示在底部,则必须变得更复杂一些。

每个 cmets,我意识到 Access 不支持没有 FROM 子句的 SELECT 语句,这很烦人。一种解决方法是创建一个表tblAll(可能需要修改语法):

create table tblAll(ID varchar(15), Name varchar(30));
insert into tblAll(ID, Name) values ('ALL', 'SHOW ALL');

那么你可以这样做:

select ID, Name
from tblAll
union all
select str(ID) as ID, Name
from tblItems

【讨论】:

  • 您可能需要将 ID 转换为字符串值才能使其正常工作,我不确定 MSAccess 是如何处理的。
  • 我收到一条错误消息,指出“查询输入必须包含至少一个表或查询”。我有 Row Source 指向“Query2”,其中包含您的上述语法。我已经尝试简化我的代码,但我无法让这种语法适用于 Access?我也直接从 Query2 窗口尝试过(数据表视图会引发相同的错误)
  • @StuckAtWork:这很不幸,这也是不将 Access 与真正的数据库系统混淆的另一个原因。我已经更新了我的答案。
  • Jet 允许您 SELECT 0, "All" 但在 Union'd 时不允许。您(显然)必须提供一个虚拟表,这与许多数据库系统相同。 Jet 的唯一限制是它没有内置的虚拟表,您必须创建一个具有适当数据类型的单行虚拟表。我只是希望有人知道这个虚拟桌子,但我越看越发现它没有。
  • @Remou,所以如果不需要创建新表,我们可以期待你的工作答案吗?您提到这是一个标准问题,解决方案是什么?
【解决方案2】:

我所做的是使用SELECT TOP 1 语句并使用现有的表名,所以它看起来像这样:

SELECT ID, Name FROM tblItems
UNION
SELECT TOP 1 'ALL', 'SHOW ALL' FROM tblItems

这将为您提供单行以及现有表格中的选择。您可以为TOP 1 行使用任何您想要的表格。

【讨论】:

    【解决方案3】:

    只是想修复 Jeremy Holovacs 的答案以在 MS Access 中工作。这样您就可以使用同一张表,而不必创建虚拟表。

    SELECT ID, Name
    FROM tblItems
    UNION ALL
    SELECT TOP 1 'ALL', 'SHOW ALL' 
    FROM tblItems
    

    【讨论】:

      【解决方案4】:

      您可以使用UNION ALL,但是,常量和列之间存在不匹配(“ALL”不是整数)。你可能会这样做:

      select ID, NAME from tblItems
      union all
      select 0, 'SHOW ALL'
      

      在应用程序端,将 ID 0 解释为“SHOW ALL”。或者,将 ID 转换为字符串。

      select str(ID), NAME from tblItems
      union all
      select 'ALL', 'SHOW ALL'
      

      【讨论】:

      • 我认为 Access 在“显示所有”之后需要一个表。这就是我需要的语法。它会引发“查询中没有表或查询”的错误。我已经看到其他数据库使用诸如“SYS.DUMMY”类型的东西作为常量值的表名,但无法找到它进行访问。
      • @StuckAtWork 请看我上面的链接。
      【解决方案5】:

      请注意,以下仅在表中有任何行时才有效,如果您有一个空表,则它将不起作用。

      SELECT ID, Name
      FROM tblItems
      UNION ALL
      SELECT TOP 1 'ALL', 'SHOW ALL' 
      FROM tblItems
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2022-01-04
        • 1970-01-01
        • 2021-10-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多