行(rowid,0)在以下查询中的含义是什么
select * from emp
WHERE (ROWID,0) in (
select rowid, mod(rownum,2) from emp
);
我没有得到WHERE (ROWID,0)
行。
是什么?
提前thanx
答案 0 :(得分:2)
IN
子句可以支持列组。你可以这样做:
select ...
from tab1
where (tab1.col1, tab1.col2) in (
select tab2.refcol1, tab2.refcol2
from tab2
)
在许多情况下,这可能很有用。
在您的特定情况下,子查询用于第二个表达式mod(rownum,2)
。由于没有顺序,这意味着rownum
将以数据库检索行的顺序 - 可能是全表扫描或快速完整索引扫描。
然后通过使用mod
子查询中的每一行得到值0,每隔一行得到值1.
然后IN
子句过滤子查询中的第二个值等于0.最终结果是此查询检索了员工的一半。哪一半取决于优化器选择的访问路径。
答案 1 :(得分:0)
不确定您正在使用的sql方言,但似乎由于IN子句中的子查询在选择列表中有两列,因此(ROWID,0)指示哪些列与子查询对齐。我以前从未在IN语句的选择列表中看到多个列。
答案 2 :(得分:0)
这是一些数据库(但不是全部)使用的语法,允许您使用多个值执行in
。
使用in
,这与:
where exists (select 1
from emp e2
where e2.rowid = emp.rowid and
mod(rownum, 2) = 0
)
我应该注意,如果您使用的是Oracle(允许使用此语法),那么您在没有rownum
的子查询中使用order by
。结果将是相当随意的。但是,从某种意义上说,目的似乎是返回所有其他行。