【问题标题】:The specified 'Field' field may refer to more than one table that appears in the FROM clause in an SQL statement指定的“字段”字段可能引用出现在 SQL 语句的 FROM 子句中的多个表
【发布时间】:2018-12-02 08:26:24
【问题描述】:
Select U.Field 
from (
  SELECT Field 
  FROM PhonesTBL 
  Inner join HistoryTBL on PhonesTBL.Field=Field.PhoneID 
  group by Field 
  Order By Count(*) Desc
  Union All 
  Select Field 
  From HistoryTBL Inner Join UsersTBL on HistoryTBL.UserID = UsersTBL.UserID 
  Where UBirthday Between #date1# and #date2# 
  Group By Field 
  Order By Count(*) Desc) u 
Group by u.Field 
having Count(*) > 1

以下查询返回标题中的异常,我不知道我做错了什么,因为我在其他表上使用相同的 union all 方法并且它有效,请帮助我:)

【问题讨论】:

  • 您的查询有几个拼写错误,甚至无法运行。请显示所有表格的定义。
  • 将“PhonesTBL.Field=Field.PhoneID 上的内部加入 HistoryTBL”更改为“PhonesTBL.Field=HistoryTBL.PhoneID 上的内部加入 HistoryTBL”,看看是否有帮助。还要从内部查询中删除 order by,因为它对最终结果集没有任何影响。
  • 您应该努力与您编写 SQL 关键字的方式一致 - 要么 将它们全部大写(SELECT,FROM),或全部小写(select、from)或混合大小写(Select、From) - 但请选择一种样式,然后坚持使用它 - 不要将它们混合在一起!

标签: c# sql ms-access


【解决方案1】:

一些建议:

  • 限定查询中的所有列名称,尤其是当您有多个表引用时。
  • 不要在子查询中使用order by

以下可能会做你想做的事:

select U.Field 
from (select PhonesTBL.Field 
      from PhonesTBL inner join
           HistoryTBL
           on PhonesTBL.Field = Field.PhoneID 
      group by PhonesTBL.Field 
      union all 
      select UsersTBL.Field 
      from HistoryTBL Inner Join
           UsersTBL
           on HistoryTBL.UserID = UsersTBL.UserID 
      where UsersTBL.UBirthday Between #date1# and #date2# 
      group by UsersTBL.Field 
     ) as u 
group by u.Field 
having count(*) > 1;

如果有一个更简单的查询来完成您想要的,我不会感到惊讶——但您没有指定它是什么。如果您想调查此查询的替代方案,您可以问另一个问题,其中包含示例数据、所需结果、解释以及您对解决方案的尝试。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-19
    相关资源
    最近更新 更多