2012-11-16 174 views
0
select a.subscriber_msisdn, war.created_datetime from 
(
select distinct subscriber_msisdn from wiz_application_response 
where application_item_id in 
(select id from wiz_application_item where application_id=155) 
and created_datetime between '2012-10-07 00:00' and '2012-11-15 00:00:54' 
) a 
left outer join wiz_application_response war on (war.subscriber_msisdn=a.subscriber_msisdn) 

子选择返回11行,但是当连接返回18(带有重复项)时。此查询的目的只是将日期列添加到子选择的11行。选择不同于2列,但只有1个是重复的

+0

我没有看到表格定义,示例数据或PostgreSQL版本。 –

回答

0

根据您的描述,可以推断出有一些subscriber_msisdn值有多个created_datetime值,这是促使您在子查询中使用distinct的开始。通过将子查询加入到原始表中,您正在击败这一点。一个更清晰的方式来编写查询将是:

SELECT 
    war.subscriber_msisdn 
    , war.created_datetime 
FROM 
    wiz_application_response war 
    LEFT JOIN wiz_application_item wai 
    ON war.application_item_id = wai.id 
    AND wai.application_id = 155 
WHERE 
    war.created_datetime BETWEEN '2012-10-07 00:00' AND '2012-11-15 00:00:54' 

这应该只返回战争表中满足基于wai表的条件的行。除非您希望返回满足created_datetime参数的war表中的所有行,而不考虑application_item_id参数,否则它不应该是外连接。

这是我最好的猜测,基于我对你的桌子有限的信息以及我假设你正在努力完成的事情。如果这不能为您带来什么,我会根据您提供的其他信息继续提供其他建议。希望这可以工作。

0

能最有可能简化为这样的:

SELECT DISTINCT ON (1) 
     r.subscriber_msisdn, r.created_datetime 
FROM wiz_application_item i 
JOIN wiz_application_response r ON r.application_item_id = i.id 
WHERE i.application_id = 155 
AND i.created_datetime BETWEEN '2012-10-07 00:00' AND '2012-11-15 00:00:54' 
ORDER BY 1, 2 DESC -- to pick the latest created_datetime 

细节取决于丢失的信息。

More explanation here.

相关问题