内连接返回更多行然后常规选择

时间:2014-05-21 01:08:56

标签: sql oracle

我有这样的查询:

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行,我想加入它以确定是否需要处理该特定运行。

我的加入条件中是否有我遗漏的东西?

1 个答案:

答案 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中的每个匹配行匹配,从而创建额外的结果。