我如何根据两个列获得一个结果,其中值的顺序定义唯一索引

时间:2013-07-23 15:55:54

标签: sql oracle plsql

我的oracle数据库中存在这种情况:我有一个名为 CONNECTIONS 的表,它包含 OBJECTS 表的两个外键以及建立连接的日期。建立连接的顺序与系统相关,因此连接

OBJ1 | OBJ2 | DATE_CONN_MADE
-----------------------------
1    | 2    | 01/01/2000

与连接不同

OBJ1 | OBJ2 | DATE_CONN_MADE
----------------------------
2    | 1    | 01/01/2000

我的问题是:我可以通过某种方式获得双向连接的日期。

我的架构的相关部分是

表对象:

ID | NAME

表连接

OBJ1 | OBJ2 | DATE_CONN_MADE

OBJ1和OBJ2是OBJECTS.ID的外键

我提出了查询

SELECT c.date_conn_made
  FROM CONNECTIONS c
 WHERE    (    c.obj1 = {parameter}
           AND c.obj2 IN (SELECT c.obj1
                            FROM CONNECTIONS
                           WHERE c.obj2 = {parameter}))
       OR (    c.obj2 = {parameter}
           AND c.obj1 IN (SELECT c.obj2
                            FROM CONNECTIONS
                           WHERE c.obj1 = {parameter}));

给我这两个连接的所有两个日期,但我希望只获得更大的连接。

2 个答案:

答案 0 :(得分:2)

通过巧妙地使用聚合,您实际上可以在没有自联接的情况下执行此操作。

select least(obj1, obj2), greatest(obj1, obj2), max(date_conn_made)
from connections
group by least(obj1, obj2), greatest(obj1, obj2);

使用least()greatest()将两个对象放在相同的顺序中,无论原始方向如何。

答案 1 :(得分:1)

SELF JOINCONNECTIONS怎么样?这将提供所有可用的对。

SELECT c1.date_conn_made, c1.obj1, c1.obj2, 
FROM CONNECTIONS c1
JOIN CONNECTIONS c2 ON c1.date_conn_made =  c2.date_conn_made 
                       AND c1.obj1=c2.obj2 
                       AND c2.obj1=c1.obj2;

它假设您对同一天制作的双向连接感兴趣。它会对你有用吗?

如果你想要双向连接完成的日期(假设每个方向都可以在同一天发生,那么:

SELECT MAX(c1.date_conn_made), c1.obj1, c1.obj2, 
FROM CONNECTIONS c1
JOIN CONNECTIONS c2 ON c1.obj1=c2.obj2 AND c2.obj1=c1.obj2
GROUP BY c1.obj1, c1.obj2;

以上所有代码均未经过测试。