Oracle SQL关联locations、countries表查询同国街道出现重复结果如何解决
问题原因
你当前的自连接逻辑仅限制了两个街道地址不相等,没有限制配对的顺序,因此每一组同国家的不同街道都会生成正反两条对称的重复记录。
解决方法
将自连接的不等条件从A.STREET_ADDRESS <> B.STREET_ADDRESS调整为大小比较的单向条件,即可保证每组配对仅出现一次。另外推荐将隐式的逗号表连接改为显式JOIN写法,逻辑更清晰易读。
修正后的查询语句如下:
SELECT A.STREET_ADDRESS AS "CALLE A", C.COUNTRY_NAME, B.STREET_ADDRESS AS "CALLE B" FROM HR.LOCATIONS A JOIN HR.LOCATIONS B ON A.COUNTRY_ID = B.COUNTRY_ID AND A.LOCATION_ID < B.LOCATION_ID JOIN HR.COUNTRIES C ON A.COUNTRY_ID = C.COUNTRY_ID ORDER BY C.COUNTRY_NAME
注:这里使用
LOCATION_ID(locations表的主键)做大小比较比直接比较街道地址更严谨,可避免不同地点出现同名字段时的逻辑错误。如果确认不会有重名街道,也可以替换为A.STREET_ADDRESS < B.STREET_ADDRESS,效果一致。
原查询中使用的DISTINCT也可以去掉,因为单向大小比较已经保证了不会有重复配对,也不会出现同条记录自连接的情况。
内容的提问来源于stack exchange,提问作者PerCT
相关产品推荐
相关产品推荐

