0

我想取一个 Oracle 表的样本,但不包括另一个表中的条目。我有一个当前有效的查询,但我很确定当子选择获得超过 1000 条记录时它会爆炸。

select user_key from users sample(5)
where active_flag = 'Y'
and user_key not in (
    select user_key from user_validation where validation_state <> 'expired'
);

如果没有not in. _ 我曾想过使用minus,但随着新条目被添加到 user_validation 表中,我的样本量将继续下降。

4

3 回答 3

3

您可以使用以下命令执行此操作left outer join

select *
from (select u.user_key,
             count(*) over () as numrecs
      from users u left outer join
           user_validation uv
           on u.user_key = uv.user_key and
              uv.validation_state <> 'expired'
      where u.active_flag = 'Y' and uv.user_key is null
     ) t
where rownum <= numrecs * 0.05

您正在使用示例子句。目前尚不清楚您是否只想要您选择的 5% 中的不匹配数据,或者您是否想要 5% 的不匹配数据。这是后者。

编辑:根据作者的评论添加示例:

select user_key from (
  select u.user_key, row_number() over (order by dbms_random.value) as randval
  from users u 
    left outer join user_validation uv 
    on u.user_key = uv.user_key 
    and uv.validation_state <> 'expired'
  where u.active_flag = 'Y' 
  and uv.user_key is null
) myrandomjoin where randval <=100;
于 2013-04-03T17:38:50.540 回答
2
select us.user_key
from users us -- sample(5)
where us.active_flag = 'Y'
and NOT EXISTS (
    SELECT *
    from user_validation nx
    where nx.user_key = us.user_key
    AND nx.validation_state <> 'expired'
    );

顺便说一句:我注释掉了示例(5),因为我不知道它是什么意思。(但我坚信这无关紧要)

于 2013-04-03T17:03:28.993 回答
1
select u.user_key from users u, user_validation uv
where u.active_flag = 'Y'
and u.user_key=uv.user_key 
uv.validation_state= 'expired';

这是一个双重否定查询,x不在未过期ID列表中,相当于x在过期ID列表中,这就是我所做的,除了将子查询更改为连接。

于 2013-04-03T16:58:55.553 回答