Oracle SQL技术问题:筛选在至少2种不同报纸刊登的房产
解决同一报纸多次刊登的房产误判问题
嘿,我懂你的困扰了!你之前的查询之所以会把同一房产在同一份报纸多次刊登的情况误判成符合条件,核心问题就是没对「不同报纸」做去重统计——COUNT(*)会把同一报纸的每条广告都算一次,而我们需要的是统计不同报纸的数量。
给你两个简洁且正确的解法:
解法一:子查询先筛选符合条件的房产ID
先从广告表中找出那些在至少2种不同报纸登过广告的房产编号,再关联房产表获取详细信息:
SELECT P.pno, P.suburb, P.type FROM Property P JOIN ( -- 子查询:统计每个房产的不同报纸数量,筛选出≥2的 SELECT pno FROM Advertisement GROUP BY pno HAVING COUNT(DISTINCT newspaper) >= 2 ) AS QualifiedProperties ON P.pno = QualifiedProperties.pno;
解法二:直接关联后分组筛选
也可以直接关联两张表,然后按房产分组,用去重统计来筛选:
SELECT P.pno, P.suburb, P.type FROM Property P JOIN Advertisement A ON P.pno = A.pno GROUP BY P.pno, P.suburb, P.type HAVING COUNT(DISTINCT A.newspaper) >= 2;
关键原理
这两个写法的核心都是用 COUNT(DISTINCT newspaper) 替代普通的 COUNT(*):
COUNT(*)会统计该房产的所有广告条数,包括同一报纸的多次刊登COUNT(DISTINCT newspaper)只会统计该房产涉及的不同报纸的数量,完美排除了同一报纸多次刊登的干扰,解决你提到的pno=40的误判问题
内容的提问来源于stack exchange,提问作者Pythonnewb
相关产品推荐
相关产品推荐

