16

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

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

4 回答 4

4

使用 least() 和 best() 运算符很容易实现这一点,但由于 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
于 2012-07-29T09:19:12.627 回答
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 中的任何一个中执行此操作,我不会删除我的答案。

于 2012-07-29T08:39:36.863 回答
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;

第一个查询获取不以源为目标的链接,第二个查询以源为目标的匹配项,但相反。它可能不是最快的实现,但确保您在源列和目标列上有索引将有助于它,它是否对您来说是高性能取决于超链接表的大小或可能获得的大小。

于 2012-07-29T08:39:27.460 回答
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
于 2012-07-29T08:40:30.707 回答