我有如下三张大桌子......
property
--------
property_id
other_prop_data
transfer_property
-----------------
property_id
transfer_id
transfer
--------
transfer_id
contract_date
transfer_price
我想返回在“2012-01-01”和“2012-06-30”之间发生的所有转移的唯一属性 ID 列表。这是我到目前为止的代码......
SELECT *
FROM property p
JOIN
(
SELECT t.transfer_id, t.contract_date, t.transfer_price::integer, tp.property_id
FROM transfer t
LEFT JOIN transfer_property tp ON tp.transfer_id = t.transfer_id
WHERE t.contract_date BETWEEN '2012-01-01' AND '2012-06-30'
) transfer1 ON transfer1.property_id = p.property_id
AND NOT EXISTS
(
SELECT transfer2.transfer_id
FROM
(
SELECT t.transfer_id, t.contract_date, t.transfer_price::integer, tp.property_id
FROM transfer t
LEFT JOIN transfer_property tp ON tp.transfer_id = t.transfer_id
WHERE t.contract_date BETWEEN '2012-01-01' AND '2012-06-30'
) AS transfer2
WHERE transfer2.property_id = transfer1.property_id
AND transfer2.contract_date > transfer1.contract_date
)
这有效(我认为)但非常慢。
我在...中发现了几个类似的查询... https://stackoverflow.com/questions/tagged/greatest-n-per-group ...但我发现的大多数查询都是与同一张表的自连接,而不是连接关系表如上。
我知道在 MySQL 中您可以使用用户变量,但我不知道如何在 PostgreSQL 中执行此操作,或者在这种情况下它是否是理想的解决方案。
有没有人对如何改进这个查询有任何建议(或者甚至如何使用与我上面完全不同的方法来做到这一点)?
很感谢任何形式的帮助。谢谢!
问候,
克里斯
PS:也尝试过 DISTINCT 和 MAX 的变体,但不相信他们会以我使用它们的方式选择最近日期的记录。
编辑:对不起伙计们,我还应该补充一点,我正在 PGADMIN 1.12.3 中运行我的查询