原始出处:
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)
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.