Oracle:检查其他表中是否存在行

时间:2009-12-16 19:33:29

标签: sql database oracle join exists

我有一个查询连接几个表并返回了很多列。

另一个表的索引列引用其中一个连接表的PK。现在我想在查询中添加另一列,说明新表中是否至少存在一个具有该ID的行。

所以如果我有一张旧表

ID
 1
 2
 3

和新表

REF_ID
1
1
1
3

然后我想得到

ID   REF_EXISTS
 1            1
 2            0
 3            1

我可以想到几种方法,但最优雅/最有效的方法是什么?


修改 我测试了旧表中50.000记录提供的查询的性能,每个其他记录与新表中的两行匹配,因此一半记录的REF_EXISTS = 1。

如果有兴趣的话,我会将平均结果作为评论添加到答案中。谢谢大家!

4 个答案:

答案 0 :(得分:7)

另一种选择:

select O.ID
    , case when N.ref_id is not null then 1 else 0 end as ref_exists
from old_table o
left outer join (select distinct ref_id from new_table) N
   on O.id = N.ref_id

答案 1 :(得分:4)

我会:

select distinct ID,
       case when exists (select 1 from REF_TABLE where ID_TABLE.ID = REF_TABLE.REF_ID)
    then 1 else 0 end
    from ID_TABLE

如果您有PK和FK的索引,您将获得表扫描和索引查找。

此致 ķ

答案 2 :(得分:1)

使用:

   SELECT DISTINCT t1.id,
          CASE WHEN t2.ref_id IS NULL THEN 0 ELSE 1 END AS REF_EXISTS
     FROM TABLE_1 t1
LEFT JOIN TABLE_2 t2 ON t2.ref_id = t1.id

添加了DISTINCT以确保只显示唯一的行。

答案 3 :(得分:1)

join可以为一个ID返回多行,就像示例数据中的id=1一样。您可以通过以下方式将每个ID限制为一行:

SELECT 
    t1.id
,   COUNT(DISTINCT t2.ref_id) as REF_EXISTS
FROM TABLE_1 t1
LEFT JOIN TABLE_2 t2 ON t2.ref_id = t1.id
GROUP BY t1.id

group by确保每个ID只有一行。如果找到一行,count(distinct t2.ref_id)将为1,否则为0。

编辑:你可以在没有group by的情况下重写它,但我怀疑这会让事情变得更加轻松:

SELECT 
    t1.id
,   CASE WHEN EXISTS (
        SELECT * FROM TABLE_2 t2 WHERE t2.ref_id = t1.id)
        THEN 1 ELSE 0 END as REF_EXISTS
,   ....
FROM TABLE_1 t1