2012-11-16 151 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.

相關問題