Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL单行子查询返回多行?_Sql_Oracle_Subquery - Fatal编程技术网

SQL单行子查询返回多行?

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(

我试图从一个查询中获取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(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,而不是将其放在子查询中?这是更有效还是更有效?