从两列中选择不同的组合

时间:2012-07-29 08:13:54

标签: mysql sql

我在表Hyperlink中有两列,源和目标,用于存储超链接的源和目标。

source | destination 
-------------------- 
  a    |  b 
  b    |  c 
  c    |  d 
  c    |  b 

有两个超链接涉及b和c。两个超链接之间的区别是超链接的方向。但是,我的目标是检索唯一的超链接,无论哪个方向。因此,对于从b到c和从c到b的超链接,我只想选择其中一个。任何人都会这样做。

所以我的结果应该是这样的:

source | destination 
-------------------- 
  a    |  b 
  b    |  c 
  c    |  d 

到目前为止,我能够在Java中实现这一点,在使用JDBC执行SQL语句之前进行了一些处理。但是,当表变得非常大时,这将非常繁琐。

我想知道无论如何我都可以在SQL中执行此操作。

我尝试了SELECT DISTINCT source,destination FROM Hyperlink,但它返回了我独特的排列。我需要独特的组合。

谢谢!

4 个答案:

答案 0 :(得分:3)

使用least()和great()运算符很容易实现,但由于MySQL不支持它们,因此需要使用CASE结构来获取更小/更大的运算符。有两列这没关系,但是一旦涉及更多列,这个解决方案会变得非常混乱

select distinct 
          case 
            when source < destination then source 
            else destination 
          end as source,
          case 
            when source > destination then source 
            else destination 
          end as destination
from hyperlinks

答案 1 :(得分:2)

尝试以下查询:

SELECT DISTINCT source, destination FROM hyperlink
MINUS 
SELECT destination, source FROM hyperlinks WHERE source < destination;

这适用于Oracle。如果您使用的是PostgreSQL,DB2或TSQL,请使用EXCEPT关键字而不是MINUS。

编辑: MySQL中没有这些关键字的等价物。你必须通过选择Jim Riordan建议的值来解决这个问题。如果有人需要在其他四个主要DBMS中执行此操作,我不会删除我的答案。

答案 2 :(得分:1)

您可以使用两个单独的连接查询的并集,如下所示:

SELECT
lhs.source, lhs.destination
FROM Hyperlink lhs
LEFT OUTER JOIN Hyperlink rhs
ON rhs.source = lhs.destination
WHERE rhs.source IS NULL
UNION
SELECT
lhs.source, lhs.destination
FROM Hyperlink lhs
JOIN Hyperlink rhs
ON rhs.source = lhs.destination
WHERE rhs.destination <> lhs.source
ORDER BY source;

第一个查询获取没有源作为目标的链接,第二个获取具有source作为目标但不同的对立的匹配。它可能不是最快的实现,但确保您在源列和目标列上有索引将有助于它,无论它是否适合您,取决于Hyperlink表的大小或可能有多大。

答案 3 :(得分:0)

我尝试了这个查询,它对我有用

SELECT table1.Source, table1.Destination FROM dbo.hyperlinks table1 WHERE NOT EXISTS
(SELECT * FROM hyperlinks table2 WHERE table1.Source = table2.Destination AND table2.Source = table1.Destination)

UNION 

SELECT TOP 1 table1.Source, table1.Destination FROM hyperlinks table1 WHERE 
  (SELECT COUNT(*) FROM hyperlinks table2 WHERE table1.Source = table2.Destination AND  table2.Source = table1.Destination) > 0