【发布时间】:2015-04-05 23:12:15
【问题描述】:
我正在编写一个用作 PL/SQL 游标的 SQL 语句,它根据邮局提供的 POSTCODES 表检查 SUBURB 字段。绝大多数郊区将只有一个邮政编码,但是:
- 部分郊区拼写错误,与邮政编码不符;
- 一些郊区有多个邮政编码
为了避免不必要地访问数据库,并避免在我的结果中出现重复的地址,如果有一个与郊区对应的邮政编码,我想返回一个 POSTCODE 值,否则返回 null,并且 CODES_IN_SUBURB 计数为 null如果未找到该郊区,则计算该郊区有多少个不同的邮政编码。
我想我已经很接近了,但我在不重复自己的情况下如何修改 CODES_IN_SUBURB 一半的此语句时遇到了一些麻烦。如果我在没有 count = 1 WHERE 子句的情况下加入,我会得到重复的地址。如果我把它留在里面,我就不能以我想要的方式使用 CODES_IN_SUBURB。解决这个问题的最佳方法是什么?
SELECT dirty_data.street1,
dirty_data.suburb,
nsw_postcodes.postcode
FROM dirty_data
LEFT JOIN ( SELECT postcodes.locality, postcode, dupes.codes_in_suburb
FROM postcodes
INNER JOIN (SELECT locality, count(*) codes_in_suburb
FROM postcodes
WHERE state = 'NSW'
GROUP BY locality) dupes
ON dupes.locality = postcodes.locality
WHERE state = 'NSW' AND dupes.codes_in_suburb = 1) nsw_postcodes
ON nsw_postcodes.locality = dirty_data.suburb;
【问题讨论】:
-
如果可以共享表结构会很有帮助。
-
您的查询似乎有问题;特别是,您有一个在任何 FROM 或 JOIN 子句中都没有提及的表 (DBP_POSTCODE)。或者 DBP_POSTCODE 是一个包。还是……???
-
抱歉,我数据库中的表名是 dbp_postcode。为了清楚起见,我更改了名称,但显然不完全。