我一直试图找到这个问题的答案。
列出具有相同区域的所有位置对。结果应列出(location name 1, location name 2, location area)
,其中location name 1
和location 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
.
.
.
感谢。
答案 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 ;
答案 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 。
我希望这就是你要找的东西。