当前位置:编程学习 > C#/ASP.NET >>

子查询返回的值不止一个。当子查询跟随在 =、!=、<、<=、>、>= 之后,或子查询用作表达式时,这种情况是不允许的。

我不清楚这个问题是怎么产生的,本来都好好的,在家里的机子上运行都很正常,但到了单位之后就出现这样的问题!郁闷!
--------------------编程问答-------------------- SQL Server?
不是很明白你的意思。 --------------------编程问答-------------------- 具体sql
  
*****************************************************************************
欢迎使用CSDN论坛专用阅读器 : CSDN Reader(附全部源代码) 

最新版本:20070130

http://www.cnblogs.com/feiyun0112/archive/2006/09/20/509783.html --------------------编程问答-------------------- 数据不同导至错误
--------------------编程问答-------------------- 如:

where id = (select id from 表A) 

如果   (select id from 表A) 
 只有一条数据没有问题,但有多条就会出错.
--------------------编程问答-------------------- 可以用in


where id in(select id from 表A)
--------------------编程问答-------------------- 当然有可能出错 改 in
where id in (select id from 表A) --------------------编程问答-------------------- 一个 id 不能用 = 号连接多个值
多个的话必须用 in
表示在子句里面的所有结果 --------------------编程问答-------------------- 数据多了就会出现你这个问题.

解决方法1.where id in(select id from 表A)
2.where id =(select top 1 id from 表A) --------------------编程问答-------------------- 上面两位已经说了 --------------------编程问答-------------------- 谢谢各位回复!我用的是Asp.net 开发一个平台,其中有用户管理,我采用的是数据访问曾直接访问数据库(我用的是SQL Server 2005),然后用业务逻辑曾来调用数据访问层的函数,页面通过业务逻辑层来访问数据库,将用户信息显示在页面上。sql 语句很简单,在数据集中建立一个GetUsers()的查询:
SELECT UserId, UserName, Password, EmployeeId, AreaId, CreateDate, IsApproved,
          (SELECT Name
         FROM Employees
         WHERE (EmployeeId = Users.EmployeeId)) AS Name,
          (SELECT Area
         FROM Area
         WHERE (Users.AreaId = Users.AreaId)) AS Area
FROM Users
select 语句比表的列多了两列(Employee Name和Area)
业务逻辑层也比较简单,用表适配器调用该语句:
<System.ComponentModel.DataObjectMethodAttribute(ComponentModel.DataObjectMethodType.Select, True)> _
    Public Function GetUsers() As gdcopper.UsersDataTable
        Return Adapter.GetUsers()
    End Function
页面采用GridView控件来显示用户信息:
数据源设置如下
<asp:ObjectDataSource ID="AllUsers" runat="server"
         SelectMethod="GetUsers" TypeName="UsersBLL"
        UpdateMethod="UpdateUser"  DeleteMethod="DeleteUser" OldValuesParameterFormatString="original_{0}">
        <UpdateParameters>
            <asp:Parameter Name="username" Type="String" />
            <asp:Parameter Name="employeeid" Type="Int32" />
            <asp:Parameter Name="areaid" Type="Int32" />
            <asp:Parameter Name="isapproved" Type="Boolean" />
            <asp:Parameter Name="Original_UserId" Type="Int32" />
        </UpdateParameters>
        <DeleteParameters>
            <asp:Parameter Name="Original_UserId" Type="Int32" />
        </DeleteParameters>
    </asp:ObjectDataSource>

GridView设置如下(这里只列出简单的连接,模板部分不列出了)
<asp:GridView ID="gvUsers" runat="server" AllowPaging="True" AutoGenerateColumns="False"
        DataKeyNames="UserId" DataSourceID="AllUsers" Width="100%" EnableViewState=False >
        <Columns>
……
</asp:GridView>

这样的设计在我家里的电脑上运行都是正常的,不管是检索还是编辑、删除,但一到单位就出现这样的问题,我实在弄不明白,所以就拜托各位大哥大姐了!
上面各位的回复我试验不了,不好意思! --------------------编程问答-------------------- sql 的问题,后2个字段是子查询,它们的结果不是唯一行集,要出错,

sql 可以这样改——

select l.*,a.Area
from
(
SELECT u.UserId, u.UserName, u.Password, u.EmployeeId, u.AreaId, u.CreateDate, u.IsApproved,e.Name as EmployeeName
FROM Users as u
left join Employees as e
on e.EmployeeId = u.EmployeeId
)as l
left join Area as a
on a.AreaId = l.AreaId
order by l.UserId

目的是从Users 表中查询出所有用户(用的左关联),以及每个用户的名称(从Employees表)、所属地区(从Area表),因为是left join,这2个字段可能有的为null,要做3表完全匹配的结果,可以把left join换成inner join --------------------编程问答-------------------- 到你家里,你的数据库中的数据跟公司里的可能不一样,所以结果是不一样的 --------------------编程问答-------------------- 明白了,子查询返回多行时,要把=改成in
确实应该如此呢—— --------------------编程问答-------------------- 不行啊。。。 --------------------编程问答-------------------- SELECT   UserId,   UserName,   Password,   EmployeeId,   AreaId,   CreateDate,   IsApproved, 
                    (SELECT   Name 
                  FROM   Employees 
                  WHERE   (EmployeeId   =   Users.EmployeeId))   AS   Name, 
                    (SELECT   Area 
                  FROM   Area 
                  WHERE   (Users.AreaId   =   Users.AreaId))   AS   Area 
FROM   Users 
--前面的Users.AreaId换成AreaId试试
--建议建个视图或改成连接查询 --------------------编程问答-------------------- 查询出来了2条记录。 --------------------编程问答--------------------
引用 15 楼 laowang134 的回复:
SELECT UserId, UserName, Password, EmployeeId, AreaId, CreateDate, IsApproved, 
  (SELECT Name 
  FROM Employees 
  WHERE (EmployeeId = Users.EmployeeId)) AS Name, 
  (SELECT Area 
  FROM Area 
……


学习 --------------------编程问答-------------------- 今天遇到类似同样的问题了。 --------------------编程问答-------------------- 我遇到过同样的问题,去看你的数据库里面吧。肯定有重复的数据。返回的结果不唯一了。 --------------------编程问答-------------------- 满足条件的数据不止一条

好比
id=你的条件 

当你的条件只有一条时 成立
当你的条件 有多个时,不成立

去找找你的子查询有什么问题吧! --------------------编程问答-------------------- 或者加上TOP 1 --------------------编程问答--------------------
引用 3 楼 cpp2017 的回复:
数据不同导至错误


+1 --------------------编程问答-------------------- 标记下! --------------------编程问答-------------------- 你如果不能保证子查询的表中的数据只有一条的话   那就用IN   否则就会出现这样的错 --------------------编程问答--------------------
引用 4 楼 cpp2017 的回复:
如: where   id   =   (select   id   from   表A)   如果       (select   id   from   表A)     只有一条数据没有问题,但有多条就会出错.

感谢大侠 --------------------编程问答--------------------
引用 8 楼 ifocusyou 的回复:
数据多了就会出现你这个问题.

解决方法1.where   id   in(select   id   from   表A)
2.where   id   =(select   top   1   id   from   表A)

其实就是8楼说的,不过,还是用top 1 解决比较好 --------------------编程问答-------------------- SQL2000把?


试试SQL2005吧 --------------------编程问答-------------------- 我也学习学习
补充:.NET技术 ,  ASP.NET
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,