代码之家  ›  专栏  ›  技术社区  ›  Peter Lang

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

  •  4
  • Peter Lang  · 技术社区  · 15 年前

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

    如果我有一张旧桌子

    ID
     1
     2
     3
    

    REF_ID
    1
    1
    1
    3
    

    那我想去

    ID   REF_EXISTS
     1            1
     2            0
     3            1
    

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


    编辑

    4 回复  |  直到 15 年前
        1
  •  8
  •   Shannon Severance    15 年前

    另一种选择:

    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
    
        2
  •  4
  •   Khb    15 年前

    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上有索引,你就可以进行表扫描和索引查找。

    K

        3
  •  2
  •   OMG Ponies    15 年前

    使用:

       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 以确保仅显示唯一的行。

        4
  •  1
  •   Andomar    15 年前

    A. join id=1

    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)

    编辑:您可以不使用 分组 ,但我怀疑这会让事情变得更容易:

    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