我有一个查询连接几个表并返回了很多列。
另一个表的索引列引用其中一个连接表的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。
如果有兴趣的话,我会将平均结果作为评论添加到答案中。谢谢大家!
答案 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