我在表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
,但它返回了我独特的排列。我需要独特的组合。
谢谢!
答案 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