我有一张桌子可以比较美国航空公司的竞争力。因此,表中的一些字段是id,route_id1,route_id2,airline_id1,airline_id2,sources_airport_id和destination_airport_id。 此表是自行加入包含路由映射的路由表的结果。 但结果是,该表有一些重复的记录。
例如,
路由1与route2竞争,因为它们具有相同的source_airport和destination_airport,但具有不同的airline_id。但我有两条记录比较route1到route2和route2到route1。它们是相同的比较,但只是以不同的方式排序。
我试图通过自我加入来获取重复项:
选择t1。*
从路径AS t1,路线AS t2
在哪里t1.route_id1 = t2.route_id2 AND t1.route_id2 = t2.route_id1
但是这个查询只能获得表中相同数量的记录。
如何摆脱“重复”数据?
提前致谢。
答案 0 :(得分:1)
问题是您没有条件将t1
和t2
分开。首先,您将获得交换t1
和t2
的重复项。其次,如果任何行都有route_id1 = route_id2
,那么您也会在结果集的t1
和t2
中获得这些行。
解决这个问题的最简单方法是:
SELECT t1.* FROM routes AS t1, routes AS t2
WHERE t1.route_id1 = t2.route_id2 AND t1.route_id2 = t2.route_id1
AND t2.id > t1.id
添加的标准是一行的id必须大于另一行。这意味着返回的t1
将始终是id较低的行。你当然可以用<或者交换参数以获得具有较高id的行。
这将消除大部分重复。如果数据库中也有正确的重复项,那么将在上述查询的结果集中创建一些重复的行。原因是“复制”可能被检测为两个不同对应行的“复制”,而这两个行又是实际重复的。
答案 1 :(得分:0)
使用字段的实际名称并使用DISTINCT子句而不是使用t1。*。 在字段列表中,请确保您不包含airline_id,因为它们不同,它们会使您的记录不重复。
答案 2 :(得分:0)
您是否尝试过使用“SELECT DISTINCT t1.* FROM ...
”?