我有这样的查询:
SELECT id, run_date, feed_type_id, text
FROM myTable
WHERE run_date >= ('20140506', 'yyyymmdd') AND run_date < ('20140506', 'yyyymmdd') + 1
这会给我带来230k行。
当我用WITH CLAUSE包装它时:
WITH daily_run as (
SELECT /* MATERIALZE */
id, run_date, feed_type_id, text
FROM myTable
WHERE run_date >= ('20140506', 'yyyymmdd') AND run_date < ('20140506', 'yyyymmdd') + 1)
SELECT
id, run_date, feed_type_id, text from daily_run run;
这也给我带来了230k行。
然而,当我加入时:
WITH daily_run as (
SELECT /* MATERIALZE */
id, run_date, feed_type_id, text
FROM myTable
WHERE run_date >= ('20140506', 'yyyymmdd') AND run_date < ('20140506', 'yyyymmdd') + 1)
SELECT
run.id, run.run_date, run.feed_type_id, run.text
FROM daily_run run
INNER JOIN feed_id_types types
ON run.feed_type_id = types.feed_type_id
我增加了5万行。无论我运行它的日期(不总是50k),行的增加都会发生。
另一个令人困惑的部分是用不同的条件替换连接:
SELECT
run.id, run.run_date, run.feed_type_id, run.text
FROM daily_run run
WHERE run.feed_type_id in (SELECT types.feed_type_id FROM feed_id_types types)
返回正确的230k数字。
表feed_id_types有19行,我想加入它以确定是否需要处理该特定运行。
我的加入条件中是否有我遗漏的东西?
答案 0 :(得分:2)
您在feed_id_types中有重复的行。运行此命令以查找重复的ID:
select
types.feed_type_id
from feed_id_types types
group by types.feed_type_id
having count(*) > 1
IN()
子句忽略重复项,匹配它找到的第一个副本。内部联接将daily_run
中的每一行与feed_id_types
中的每个匹配行匹配,从而创建额外的结果。