如何在比较行和列时查找特定的属性值

时间:2018-08-17 23:33:17

标签: sql oracle

no tot place1   place2
1  1    colombo  negombo
1  2    negombo  kandy
1  3    kandy    colombo
2  1    colombo  kandy
2  2    kandy    jafna 
2  3    jafna    negombo
3  1    jafna    kaduwela
3  2    kaduwela jafna
4  1    trico    colombo 

在此,我想让noplace1place2相同。

示例:

no 1的总数为3 tot,并且其place1place2相等,因为它是'Colombo'(比较列和行)。

但是no 2的place1place2并不相同。

如何通过查询检索类似的数据?

3 个答案:

答案 0 :(得分:1)

如果我的理解正确,您希望place1中的列表与place2中的no中的列表匹配。

如果是这样,您可以使用listagg()

select no, listagg(place1, ',') within group (order by place1) as places
from t
group by no
having listagg(place1, ',') within group (order by place1) = listagg(place2, ',') within group (order by place2);

答案 1 :(得分:0)

您可以使用ROW_NUMBER()来确定该旅程的终点​​站位置(或它们的位置)。从开始到目的地的顺序,反之亦然。终端的ROW_NUMBER()为1。对第一顺序的终端使用PLACE1,对于第二顺序的终端使用PLACE2。然后加入结果并比较端子。如果它们相等,则可以往返,并且可以返回各自的NO

SELECT X.NO
       FROM (SELECT NO,
                    PLACE1 PLACE,
                    ROW_NUMBER() OVER (PARTITION BY NO
                                       ORDER BY TOTN ASC) RN
                    FROM ELBAT) X
            INNER JOIN (SELECT NO,
                               PLACE2 PLACE,
                               ROW_NUMBER() OVER (PARTITION BY NO
                                                  ORDER BY TOTN DESC) RN
                               FROM ELBAT) Y
                       ON Y.NO = X.NO
       WHERE X.RN = 1
             AND Y.RN = 1
             AND X.PLACE = Y.PLACE;

db<>fiddle

答案 2 :(得分:0)

 SELECT A.*
  FROM A A
  WHERE NOT EXISTS (SELECT 1
                    FROM B B
                    WHERE A.A = B.A)