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 行中。

4

2 回答 2

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'

这应该只返回 war 表中满足基于 wai 表的条件的行。它不应该是外连接,除非您想从 war 表中返回满足 created_datetime 参数的所有行,而不管 application_item_id 参数如何。

根据我对您的表格的有限信息以及我假设您正在尝试完成的内容,这是我最好的猜测。如果这不能满足您的需求,我将根据您可以提供的其他信息继续提供其他想法。希望这有效。

于 2012-11-16T14:21:49.463 回答
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

细节取决于缺失的信息。

更多解释在这里。

于 2012-11-16T14:28:59.227 回答