2013-03-15 135 views
1

你好,我有表如下图所示:SQL复制查询结果

Table: port 
tid leftside rightside 
1  2   3   
2  3   2 
3  2   4 
4  4   2 
5  4   3 
6  3   4 
7  4   5 
8  5   4 
9  3   6 
10  6   3 

当我运行此查询

SELECT * 
FROM port pt JOIN port p 
    ON (pt.leftside = p.rightside 
    and p.leftside <> 2) 
WHERE pt.rightside = 2 

我得到这个结果

tid leftside rightside 
6  3   4 
5  4   3 
8  5   4 
10  6   3 

前两行表示同尽管它们位于相对的两侧。 我想我的查询检索只有一行,如果有重复的记录。 例如: 查询应返回下面线

tid leftside rightside 
6  3   4 

代替

tid leftside rightside 
6  3   4 
5  4   3 

这些行。

回答

0

我用它在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。

0

的另一种方法是交换过leftsiderightside和每当leftsiderightside大。然后使用PARTITION BYRANK切出重复:

SELECT tid, 
     leftside, 
     rightside 
FROM 
(
    SELECT p.tid, 
     CASE WHEN p.leftside <= p.rightside 
       THEN p.leftside 
       ELSE p.rightside 
     END AS leftside, 
     CASE WHEN p.leftside > p.rightside 
       THEN p.leftside 
       ELSE p.rightside 
     END AS rightside, 
     RANK() OVER 
     (PARTITION BY CASE WHEN p.leftside <= p.rightside 
          THEN p.leftside 
          ELSE p.rightside 
         END, 
         CASE WHEN p.leftside > p.rightside 
          THEN p.leftside 
          ELSE p.rightside 
         END 
      ORDER BY p.tid ASC) AS rank 
    FROM port pt JOIN port p 
    ON (pt.leftside = p.rightside 
     AND p.leftside <> 2) 
    WHERE pt.rightside = 2 
) subquery 
WHERE rank = 1; 

参见SQL Fiddle Demo

+0

'pt.leftside p.rightside'给出3行,但是使用tid 5而不是tid 6 – 2013-03-15 13:49:23

+0

pt.lefts都是> pt.rights - 如果您颠倒测试,您可以有0行或全部4行: ) – 2013-03-15 13:56:14

+0

你是对的 - 编辑我的答案使用不同的方法,并测试它这次! – 2013-03-15 14:30:52