我用它在MS SQL
with port as
(
select 1 as tid, 2 as leftside, 3 as rightside
UNION ALL
select 2, 3, 2
UNION ALL
select 3, 2, 4
UNION ALL
select 4, 4, 2
UNION ALL
select 5, 4, 3
UNION ALL
select 6, 3, 4
UNION ALL
select 7, 4, 5
UNION ALL
select 8, 5, 4
UNION ALL
select 9, 3, 6
UNION ALL
select 10, 6, 3
)
SELECT *
FROM port pt JOIN port p
ON (pt.leftside = p.rightside
and p.leftside <> 2)
WHERE pt.rightside = 2
发挥拿到了这个结果 -
(pt.tid pt.leftside pt.rightside p.tid p.leftside p.rightside)
2 3 2 5 4 3
4 4 2 6 3 4
4 4 2 8 5 4
2 3 2 10 6 3
通过添加in (subquery)
WHERE子句...
SELECT *
FROM port pt JOIN port p
ON (pt.leftside = p.rightside
and p.leftside <> 2)
WHERE (pt.rightside = 2)
AND p.tid in (SELECT max(chk.tid) FROM port chk
GROUP BY Case when leftside>rightside
then rightside else leftside end,
Case when leftside<rightside
then rightside else leftside end
)
它得到摆脱p.tid = 5的行,因为它不是匹配对的较高(Max)值。
说明:这将列出所有10行,左侧和右侧按低/高顺序排列。
SELECT tid,
Case when leftside>rightside then rightside else leftside end as lower,
Case when leftside<rightside then rightside else leftside end as higher
FROM port
因此,通过分组较低&更高,和检索最大(TID),我们得到匹配对更高TID。
'pt.leftside
pt.lefts都是> pt.rights - 如果您颠倒测试,您可以有0行或全部4行: ) – 2013-03-15 13:56:14
你是对的 - 编辑我的答案使用不同的方法,并测试它这次! – 2013-03-15 14:30:52