此子查询最多可以返回一条记录。 (错误3354)

时间:2014-02-03 14:09:17

标签: sql ms-access

我的查询得到此错误有助于我恢复它

SELECT CompanyId, CompanyName, RegistrationNumber,
  (select CompanyAddress from RPT_Company_Address where 
   RPT_Company_Address.CompanyId=Company.CompanyId) AS CompanyAddress, 
  MobileNumber, FaxNumber, CompanyEmail, CompanyWebsite, VatTinNumber
FROM Company;`

4 个答案:

答案 0 :(得分:7)

下面的子查询返回多个结果

select CompanyAddress 
from RPT_Company_Address 
where RPT_Company_Address.CompanyId = Company.CompanyId

因此,多个地址与您的公司ID匹配。

尝试修复数据或使用:

select top 1 CompanyAddress 
from RPT_Company_Address 
where RPT_Company_Address.CompanyId = Company.CompanyId

答案 1 :(得分:4)

您的RPT_Company_Address表似乎有一个给定公司的地址。如果这不可能,您应该尝试更正数据并修改架构以防止发生这种情况。

另一方面,如果可以有多个地址,则必须确定查询应如何处理它们:

1)您是否希望多次列出相同的公司行 - 每个地址一个?如果是这样,请使用INNER JOIN将其全部归还:

SELECT Company.CompanyId, CompanyName, RegistrationNumber, CompanyAddress, ...
FROM Company
INNER JOIN RPT_Company_Address RCA ON RCA.CompanyId = Company.CompanyId

2)如果您只想要第一个匹配的地址,请在与每个公司对应的第一个匹配地址上执行子查询:

SELECT Company.CompanyId, CompanyName, RegistrationNumber, CompanyAddress, ...
FROM Company
INNER JOIN
(
    SELECT CompanyId, ROW_NUMBER() OVER (ORDER BY 1 PARTITION BY CompanyId) AS Num
    FROM RPT_Company_Address
) Addresses
    ON Addresses.ComapnyId = Company.CompanyId  
WHERE Num = 1

3)如果您还有其他方法可以识别所需的“主要”地址,请在该条件中加入WHERE子句:

SELECT Company.CompanyId, CompanyName, RegistrationNumber, CompanyAddress, ...
FROM Company
INNER JOIN RPT_Company_Address RCA ON RCA.CompanyId = Company.CompanyId
WHERE RCA.PrimaryAddress = 1

答案 2 :(得分:1)

在我看来,您的RPT_Company_Address表包含一些CompanyIds的多个条目。

答案 3 :(得分:0)

我发现这个问题是因为我也收到了这个错误,“这个子查询最多可以返回一条记录。”我的回答不适用于上述问题,但我会提供它,以防我找到的解决方案可以帮助其他人或我自己在将来解决该错误。

2014 年给出的所有三个答案都说错误表明表 RPT_Company_Address 包含多个具有相同字段 CompanyId 值的记录。但是,在我的情况下,CompanyId 角色中的字段设置为没有重复的索引,因此它不可能在多个记录中具有相同的值。

为了说明我的情况和我找到的解决方案,我将首先通过删除不相关的字段将提问者的代码减少到最少的相关内容:

SELECT 
  (select CompanyAddress from RPT_Company_Address 
   where RPT_Company_Address.CompanyId = Company.CompanyId) AS CompanyAddress
FROM Company;

但是,就我而言,我最初没有在第二次出现的 CompanyId 之前添加表名 Company。因此我最初的代码是这样的:

SELECT 
  (select CompanyAddress from RPT_Company_Address 
   where RPT_Company_Address.CompanyId = CompanyId) AS CompanyAddress
FROM Company;

这显然是错误的原因。当我在第二次出现 Company. 时插入前缀 CompanyId 时,错误消失了。

我不知道为什么没有第二个前缀的代码使子查询表现得好像它返回多个值,或者让 Access 认为它​​的行为是那样的,但插入该前缀纠正了行为。