2012-07-29 28 views
12

我有兩列,表格超鏈接中的源和目標,用於存儲超鏈接的源和目標。從兩列中選擇不同的組合

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

有兩個超鏈接涉及b和c。兩個超鏈接之間的區別是超鏈接的方向。但是,我的目標是檢索獨特的超鏈接,無論是哪個方向。因此,對於從b到c和從c到b的超鏈接,我只想選擇其中的一個。任何人都會這樣做。

所以我的結果應該是這樣的:

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

到目前爲止,我能夠在我執行使用JDBC SQL語句來實現這在Java中,有一些處理。然而,當桌子變得非常大時,這將是非常乏味的。

我不知道是否有反正我可以在SQL中做到這一點。

我試過SELECT DISTINCT source,destination FROM Hyperlink但它返回了我獨特的排列。我需要獨特的組合。

謝謝!

+2

如果您發佈代碼,XML或數據樣本,請**在文本編輯器中突出顯示這些行,然後單擊編輯器工具欄上的「代碼示例」按鈕(「{}」)可以很好地格式化和語法突出顯示它!那麼你不需要任何雜亂的'
'和' '標籤! – 2012-07-29 08:17:45

+2

太棒了,謝謝你的提示!很難嘗試使用亂七八糟的標籤。 – paperclip 2012-07-29 08:20:52

+1

感謝編輯,Arkain! – paperclip 2012-07-29 08:21:09

回答

3

這是用最少的()和最大()操作很容易實現,但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 
+0

這一個適合我。我只用兩列工作,所以這個解決方案足夠好。謝謝! – paperclip 2012-07-29 11:25:05

1

您可以使用union兩個單獨的連接查詢的,像這樣:

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; 

第一查詢獲取不具有源作爲目標的聯繫,第二個獲得具有源作爲比賽目的地,但不同的對立面。它可能不是最快的實現,但確保在源列和目標列上有索引可以幫助它,無論它對您來說是否表現取決於Hyperlink表的大小或可能獲得的大小。

2

嘗試以下查詢:

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

這適用於甲骨文。如果您使用的是PostgreSQL,DB2或TSQL,請使用EXCEPT關鍵字而不是MINUS。

編輯: 在MySQL中沒有這些關鍵字的等價物。您必須通過選擇Jim Riordan建議的值來解決此問題。如果有人需要在其他四個主要數據庫管理系統中執行此操作,我不會刪除我的答案。

+0

我正在使用MySQL,但感謝您的回答。如果沒有錯,在MySQL中它應該是UNION而不是MINUS。再次感謝! – paperclip 2012-07-29 08:48:27

+0

@paperclip據我所知,一個'UNION'結合了來自表格的行並刪除重複項。這是不同的。 'MINUS'是一個集合操作,它爲另一個集合中的每個相同行從集合中刪除一行。 '(A,B,C)UNION(C,D)'給出'(A,B,C,D)'。但是(A,B,C)MINUS(C,D)'返回(A,B)'。你不能只替換一個,你必須顯着改變SELECT語句。 – toniedzwiedz 2012-07-29 08:58:47

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 
+0

我不明白你的說法。 table2從哪裏來? – paperclip 2012-07-29 08:57:00

+0

這是超鏈接表的別名!因爲我在查詢中多次使用超鏈接表,所以必須使用別名。我使用了test1和test2。你可以使用任何你想要的名字! – Azade 2012-07-29 09:12:54

+0

哦,我現在明白了。 :) – paperclip 2012-07-29 09:14:36