table1:
columns: id, name
table2:
columns: id, name
assoc_table1_table2:
columns: id_table1, id_table2
我需要从table1
中选择table2
中至少有一行与此行相关联的所有行。
什么是有效的方法呢?或者,在某种程度上更正确?
我在考虑:
SELECT DISTINCT t.id, t.name
FROM table1 t
JOIN assoc_table1_table2 a ON t.id=a.id_table1;
或:
SELECT id, name
FROM table1 t WHERE EXISTS (
SELECT *
FROM assoc_table1_table2 a
WHERE t.id=a.id_table1
);
关于上述内容的任何想法通常都会更快?
(明显的指数已到位)
答案 0 :(得分:1)
都不是。
我建议使用“WHERE EXISTS”,因为它会为优化器提供更多自由。
使用“WHERE COUNT(*)”或DISTINCT将强制进行全表扫描计算。
您只想知道是否存在至少1行,例如,在十亿行表上。一旦db找到第一行,就可以满足“WHERE EXISTS”。在具有合理优化器的数据库上,您会发现它运行良好。