我的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}));
给我这两个连接的所有两个日期,但我希望只获得更大的连接。
答案 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 JOIN
上CONNECTIONS
怎么样?这将提供所有可用的对。
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;
以上所有代码均未经过测试。