oracle 每日一题-exists条件

原始出处:
http://www.plsqlchallenge.com/

作者:        Kim Berg Hansen

运行环境:SQLPLUS, SERVEROUTPUT已打开

我有一张表保存着我的域名,还有一张日志表保存着我的域名的访问记录:

create table plch_domains (
   domain_id   integer primary key
, domain      varchar2(30) not null unique
, hosted_by   varchar2(30)
)
/

create table plch_visits (
   domain_id   integer not null references plch_domains
, visited_on  date    not null
, visitor     varchar2(10)
)
/

insert into plch_domains values (1, ' oracle .com', null)
/
insert into plch_domains values (2, 'kibeha.dk' , 'blogspot.com')
/
insert into plch_domains values (3, 'odtug.com' , null)
/
insert into plch_domains values (4, 'doug.dk'   , null)
/

insert into plch_visits values (1, date '2016-04-04', 'user1234'  )
/
insert into plch_visits values (2, date '2016-03-03', 'golucky'   )
/
insert into plch_visits values (2, date '2017-02-02', 'hammer'    )
/
insert into plch_visits values (3, date '2017-01-01', 'the_neo_42')
/

commit
/

我想要一张域名清单,这些域名在2016年至少有一位访问者(假设我们此处所用的日期都没有时间部分)。

为此我写了个未完成的查询:

select d.domain
  from plch_domains d
where exists (
##REPLACE##
     from plch_visits v
    where v.domain_id = d.domain_id
      and v.visited_on between date '2016-01-01' and date '2016-12-31'
       )
order by d.domain_id
/

哪些选项包含了一个SELECT表达式,可以用来取代##REPLACE## 使得查询返回这样的输出:

DOMAIN
------------------------------
oracle.com
kibeha.dk

(A) 
select *

(B) 
  select 1

(C) 
select null

(D) 
select v.visitor

(E) 
  select 'Existence'

(F)
  select d.domain_id

(G)
   select d.hosted_by  

(H)
   select any

(I)

  select does_not_matter_if_just_a_row_is_there

A:(推荐)
绝对有效而且经常被使用。此处的星号(*)并不意味着“所有列”,所以它不会影响性能。
B: 这也是有效的,SELECT的是什么并不要紧,只是检测了存在与否。
C: (推荐)
在一个EXISTS子查询中,NULL 和其它任何东西一样都有效,因为列清单没有任何用处。事实上,这可以被认为是有点“自我说明”,因为实际上什么也不用选中,仅仅检测了行是否存在。
D: 选择一个列也可以——这个列并没有任何用处。
E: 任何字面常量也可以——它可以像选项B是个数字,也可以像本选项是个字符串,都无关紧要。
F: 从其它列随便选择一样东西也可以。
G: 即使这个列有NULL值也无所谓——这个列和它的值并没有任何用处。
H: 虽然我们在前面看到了,在EXISTS子查询中选择什么无所谓,但它必须是一个有效的子查询,ANY关键字不能这么使用,解析器会报错:
ORA-00936: missing expression.
I: 即使“只要有一行,其它无所谓”,它仍然必须是可选择的有效的东西,这是为了子查询能够被解析。这个选项会报错:
ORA-00904: "DOES_NOT_MATTER_IF_JUST_A_ROW_IS_THERE": invalid identifier.



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值