Where子句中的混淆语法

时间:2014-11-24 12:15:10

标签: sql oracle oracle11g

行(rowid,0)在以下查询中的含义是什么

select * from emp 
WHERE (ROWID,0) in (
    select rowid, mod(rownum,2) from emp
);

我没有得到WHERE (ROWID,0)行。

是什么?

提前

thanx

3 个答案:

答案 0 :(得分:2)

Oracle SQL中的

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。结果将是相当随意的。但是,从某种意义上说,目的似乎是返回所有其他行。