如何从Oracle中的表中列出具有相同区域的所有位置对?

时间:2013-05-19 22:16:41

标签: sql oracle

我一直试图找到这个问题的答案。

列出具有相同区域的所有位置对。结果应列出(location name 1, location name 2, location area),其中location name 1location name 2具有相同的location area。该对在输出中只出现一次。

所以表格看起来像这样:

(Loc_id, Loc_name, Loc_area)
(1, ABC, 60)
(2, ZXY, 50)
(3, DEF, 60)
(4, YUM, 60)
(5, ZUM, 50)

对:(ABC,DEF,60)(ZXY,ZUM,50)(ABC,YUM,60)(DEF,ZUM,60)等。

更新

我得到了一张带有名字,第二名和位置区域的桌子,上面有Pratik的解决方案。但是,它没有给出这个表中的任何价值。

如果我这样做会怎么样?

select t_1.Loc_name name1, t_2.loc_name name2, t_1.loc_area
from Location t_1, Location t_2
where t_1.loc_area = t_2.loc_area and t_1.loc_name<>t_2.loc_name
Order by t_1.Loc_name

我得到了所有可能组合的列表(类似于下面的Rebika解决方案)。但是现在如何从此列表中删除重复项?

我不想要

name1      name2     loc_area
ABC         DEF        60
DEF         ABC        60

我想要

name1      name2     loc_area
ABC        DEF         60
ABC        YUM         60
DEF        YUM         60
.
.
.

感谢。

4 个答案:

答案 0 :(得分:1)

试试这个,

SELECT a.loc_name, b.loc_name, a.loc_area
  FROM LOCATION a, LOCATION b
 WHERE a.loc_area = b.loc_area
   AND a.loc_name != b.loc_name
   AND a.loc_id < b.loc_id;
  • 第一个条件可确保连接相同loc_area的记录。
  • 第二个条件确保loc_name不与自身结合。
  • 第三个条件确保只返回loc_name的一个组合。

答案 1 :(得分:0)

由于您未指定oracle版本,因此如果您使用的是Oracle 11g,则可以使用此版本:

select loc_area, listagg (loc_name, ',') WITHIN GROUP 
(ORDER BY loc_name) Locations
FROM LOCATION
GROUP BY LOC_AREA;

如果您使用的是Oracle 9,请尝试使用xmlagg:

select loc_area, rtrim (xmlagg (xmlelement (e, loc_name || ',')).extract ('//text()'), ',') Locations
from LOCATION
group by LOC_AREA ;

来源:http://www.dba-oracle.com/t_converting_rows_columns.htm

答案 2 :(得分:0)

我认为以下查询将解决您的问题 -

select t_1.Loc_name name1, t_2.loc_name name2, t_1.loc_area
from Location t_1, Location t_2
where t_1.loc_area = t_2.loc_area
and t_1.loc_area<t_2.loc_area
Order by t_1.Loc_name

答案 3 :(得分:0)

试试这个 - :

SELECT a.Loc_name locname1,b.Loc_name locname2,a.Loc_area
从位置a
加入位置b
ON 1 = 1
在哪里a.area = b.area和a.Loc_name&lt;&gt; b.Loc_name

我已经避免了那些与自我配对的位置名称,例如(ABC,ABC)。如果您还想删除where子句中的条件 a.loc_name&lt;&gt; b.loc_name

我希望这就是你要找的东西。