SQL单行子查询返回多行?
我试图从一个查询中获取ID和用户名,但同时如果ID存在于另一个表中,我会在WHERE子句中查找。我得到一个错误:SQL单行子查询返回多行?,sql,oracle,subquery,Sql,Oracle,Subquery,我试图从一个查询中获取ID和用户名,但同时如果ID存在于另一个表中,我会在WHERE子句中查找。我得到一个错误: ORA-01427: single-row subquery returns more than one row 以下是我的查询的外观: SELECT s.ID, s.LASTFIRST From USERS s Left Outer Join CALENDAR c On s.ID = c.USERID Where c.SUPERVISOR = '103' And TO_CHAR(
ORA-01427: single-row subquery returns more than one row
以下是我的查询的外观:
SELECT s.ID, s.LASTFIRST
From USERS s
Left Outer Join CALENDAR c
On s.ID = c.USERID
Where c.SUPERVISOR = '103'
And TO_CHAR(c.DATEENROLLED,'fmmm/fmdd/yyyy') >= '4/22/2016'
And TO_CHAR(c.DATELEFT,'fmmm/fmdd/yyyy') <= '4/22/2016'
And s.ID != (SELECT USER_ID
From RESERVATIONS
Where EVENT_ID = '56')
选择s.ID,s.LASTFIRST
来自用户的
左外连接日历c
在s.ID=c.USERID上
其中c.SUPERVISOR='103'
和TO_CHAR(c.dateregistered,'fmmm/fmdd/yyyy')>='4/22/2016'
和TO_CHAR(c.DATELEFT,'fmmm/fmdd/yyyy')使用不在中,而不是=代码>
=
或=
用于单个ID和值,
中的和中的用于多个ID和值
And s.ID not in (SELECT USER_ID
From RESERVATIONS
Where EVENT_ID = '56')
编辑:不在
vs不存在
不存在
也是一个完全可行的选择。事实上,如果子查询结果集中可能存在null
值,则not exists
比not In
更好-在Oracle中,存在null
将导致not In
不返回任何结果。一般来说,我使用not in
表示ID,not null列,以及not exists
表示其他所有内容。最好的做法是始终使用不存在
。。。我想是个人喜好吧
不存在
将这样编写:
SELECT s.ID, s.LASTFIRST
From USERS s
Left Outer Join CALENDAR c
On s.ID = c.USERID
Where c.SUPERVISOR = '103'
And TO_CHAR(c.DATEENROLLED,'fmmm/fmdd/yyyy') >= '4/22/2016'
And TO_CHAR(c.DATELEFT,'fmmm/fmdd/yyyy') <= '4/22/2016'
And not exists (SELECT USER_ID
From RESERVATIONS r
Where r.USER_ID = S.ID
And EVENT_ID = '56')
选择s.ID,s.LASTFIRST
来自用户的
左外连接日历c
在s.ID=c.USERID上
其中c.SUPERVISOR='103'
和TO_CHAR(c.dateregistered,'fmmm/fmdd/yyyy')>='4/22/2016'
和TO_CHAR(c.DATELEFT,'fmmm/fmdd/yyyy')使用不在中,而不是=代码>
=
或=
用于单个ID和值,
中的和中的用于多个ID和值
And s.ID not in (SELECT USER_ID
From RESERVATIONS
Where EVENT_ID = '56')
编辑:不在
vs不存在
不存在
也是一个完全可行的选择。事实上,如果子查询结果集中可能存在null
值,则not exists
比not In
更好-在Oracle中,存在null
将导致not In
不返回任何结果。一般来说,我使用not in
表示ID,not null列,以及not exists
表示其他所有内容。最好的做法是始终使用不存在
。。。我想是个人喜好吧
不存在
将这样编写:
SELECT s.ID, s.LASTFIRST
From USERS s
Left Outer Join CALENDAR c
On s.ID = c.USERID
Where c.SUPERVISOR = '103'
And TO_CHAR(c.DATEENROLLED,'fmmm/fmdd/yyyy') >= '4/22/2016'
And TO_CHAR(c.DATELEFT,'fmmm/fmdd/yyyy') <= '4/22/2016'
And not exists (SELECT USER_ID
From RESERVATIONS r
Where r.USER_ID = S.ID
And EVENT_ID = '56')
选择s.ID,s.LASTFIRST
来自用户的
左外连接日历c
在s.ID=c.USERID上
其中c.SUPERVISOR='103'
和TO_CHAR(c.dateregistered,'fmmm/fmdd/yyyy')>='4/22/2016'
和TO_CHAR(c.DATELEFT,'fmmm/fmdd/yyyy')这是一个与您的问题无关的格式化注释
这很慢:
And TO_CHAR(c.DATEENROLLED,'fmmm/fmdd/yyyy') >= '4/22/2016'
因为您正在筛选函数结果
这在逻辑上是等效的,而且速度更快:
And c.DATEENROLLED >= to_date('4/22/2016','fmmm/fmdd/yyyy')
编辑从这里开始
Aaron D的回答是使用而不是。这里有两种更快的方法来做同样的事情:
left join reservations r on s.id = user_id
and r.event_id = '56'
etc
where r.user_id is null
或
这是与您的问题无关的格式化注释
这很慢:
And TO_CHAR(c.DATEENROLLED,'fmmm/fmdd/yyyy') >= '4/22/2016'
因为您正在筛选函数结果
这在逻辑上是等效的,而且速度更快:
And c.DATEENROLLED >= to_date('4/22/2016','fmmm/fmdd/yyyy')
编辑从这里开始
Aaron D的回答是使用而不是。这里有两种更快的方法来做同样的事情:
left join reservations r on s.id = user_id
and r.event_id = '56'
etc
where r.user_id is null
或
谢谢@Aron D。我尝试使用“不存在”,但没有成功。不在正常工作。不在
运行缓慢。有更快的方法来完成同样的事情。@user3023588更新的答案不存在
@Aron D谢谢!谢谢@Aron D。我尝试使用“不存在”,但没有成功。不在正常工作。不在
运行缓慢。有更快的方法来完成同样的事情。@user3023588更新的答案不存在
@Aron D谢谢!您的建议是在左join之后移动事件\ u id,而不是将其放在子查询中?这是更有效还是更有效?您的建议是在左join之后移动事件\u id,而不是将其放在子查询中?这是更有效还是更有效?