16

ハイパーリンクのソースと宛先を格納するために、ハイパーリンク テーブルにソースと宛先の 2 つの列があります。

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

b と c の両方を含む 2 つのハイパーリンクがあります。2 つのハイパーリンクの違いは、ハイパーリンクの方向です。ただし、私の目的は、方向に関係なく、一意のハイパーリンクを取得することです。したがって、b から c や c から b などのハイパーリンクの場合は、そのうちの 1 つを選択するだけです。誰でもそうするでしょう。

したがって、私の結果は次のようになります。

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

これまでのところ、JDBC を使用して SQL ステートメントを実行する前にいくつかの処理を行って、これを Java で実装することができます。ただし、テーブルが非常に大きくなると、これは非常に面倒です。

代わりにSQLでこれを行うことができる方法があるのだろうか。

試しSELECT DISTINCT source,destination FROM Hyperlinkてみましたが、一意の順列が返されます。ユニークな組み合わせが必要です。

ありがとう!

4

4 に答える 4

4

これは、least() および maximum() 演算子を使用して簡単に達成できますが、MySQL はこれらをサポートしていないため、CASE 構造を使用して小さい/大きい演算子を取得する必要があります。2 つの列でこれは問題ありませんが、列が増えるとこのソリューションはかなり面倒になります。

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 を使用している場合は、MINUS の代わりに EXCEPT キーワードを使用します。

編集: MySQL にはこれらのキーワードに相当するものはありません。Jim Riordan が提案する値を選択して、これを回避する必要があります。誰かが他の 4 つの主要な DBMS のいずれかでそれを行う必要がある場合に備えて、回答を削除するつもりはありません。

于 2012-07-29T08:39:36.863 に答える
1

次のように、2 つの個別の結合クエリの結合を使用できます。

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;

最初のクエリはリンク先としてソースを持たないリンクを取得し、2 番目のクエリはリンク先としてソースを持つ一致を取得しますが、反対の結果が異なります。おそらく最速の実装ではありませんが、ソース列と宛先列にインデックスがあることを確認すると、ハイパーリンクテーブルの大きさまたは取得可能性に応じてパフォーマンスが向上します.

于 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 に答える