2012-07-29 15 views
12

मेरे पास हाइपरलिंक्स के स्रोत और गंतव्य को संग्रहीत करने के लिए टेबल हाइपरलिंक में दो कॉलम, स्रोत और गंतव्य हैं।दो कॉलम से अलग संयोजनों का चयन करें

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

बी और सी दोनों में दो हाइपरलिंक्स हैं। दो हाइपरलिंक्स के बीच का अंतर हाइपरलिंक की दिशा है। हालांकि, मेरा उद्देश्य अनोखा हाइपरलिंक्स पुनर्प्राप्त करना है, इससे कोई फर्क नहीं पड़ता कि कौन सी दिशा है। तो बी से सी और सी से बी तक हाइपरलिंक्स के लिए, मैं बस उनमें से एक को चुनना चाहता हूं। कोई भी करेगा।

तो मेरे परिणाम इस तरह दिखना चाहिए:

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

अब तक मैं इससे पहले कि मैं JDBC का उपयोग कर SQL कथन निष्पादित कुछ प्रसंस्करण के साथ जावा में इस लागू करने के लिए, कर रहा हूँ। हालांकि, जब टेबल बहुत बड़ी हो जाती है तो यह बहुत कठिन हो जाएगा।

मुझे आश्चर्य है कि वैसे भी मैं एसक्यूएल में ऐसा कर सकता हूं।

मैंने SELECT DISTINCT source,destination FROM Hyperlink की कोशिश की लेकिन यह मुझे अद्वितीय क्रमपरिवर्तन देता है। मुझे अद्वितीय संयोजन की ज़रूरत है।

धन्यवाद!

+2

शामिल कर रहे हैं आप कोड एक्सएमएल या डेटा के नमूने पोस्ट करते हैं तो ** कृपया ** पाठ संपादक में उन पंक्तियों को उजागर करने और हो जाता है पर क्लिक करें संपादक टूलबार पर "कोड नमूने" बटन ('{}') अच्छी तरह से प्रारूपित करने और सिंटैक्स को हाइलाइट करने के लिए! तो आपको किसी भी गन्दा '
' और '  'टैग की आवश्यकता नहीं है, या तो! –

+2

महान, टिप के लिए धन्यवाद! गन्दा टैग का उपयोग करने की कोशिश करना मुश्किल था। – paperclip

+1

संपादन के लिए धन्यवाद, Arkain! – paperclip

उत्तर

3

के लिए काम किया यह कम से कम() और सबसे बड़ी() ऑपरेटर के साथ आसानी से प्राप्त है, लेकिन के रूप में MySQL उन्हें समर्थन नहीं करता है आप एक मामला निर्माण उपयोग करने की आवश्यकता छोटे/बड़े प्राप्त करने के लिए। दो स्तंभों के साथ यह ठीक है, लेकिन यह समाधान बहुत गंदा एक बार फिर कॉलम

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

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; 

पहले क्वेरी लिंक है कि गंतव्य के रूप में स्रोत नहीं है हो जाता है, दूसरे मैचों के रूप में स्रोत है कि हो जाता है गंतव्य, लेकिन विभिन्न विरोध। यह शायद सबसे तेज़ कार्यान्वयन नहीं है लेकिन यह सुनिश्चित करने के लिए कि आपके पास स्रोत और गंतव्य कॉलम पर अनुक्रमित हैं, यह आपकी सहायता करेगा, भले ही यह आपके लिए प्रदर्शन करेगा या नहीं, हाइपरलिंक तालिका कितनी बड़ी है या प्राप्त होने की संभावना है।

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

यह ओरेकल के लिए काम करता है:

2

निम्न क्वेरी का प्रयास करें। यदि आप PostgreSQL, DB2 या TSQL का उपयोग कर रहे हैं, तो MINUS के बजाय EXCEPT कीवर्ड का उपयोग करें।

संपादित करें: MySQL में इन कीवर्ड के बराबर नहीं है। जिम Riordan द्वारा सुझाए गए मूल्यों का चयन करके आपको इसके आसपास काम करना होगा। अगर किसी अन्य चार प्रमुख डीबीएमएस में किसी को भी ऐसा करने की ज़रूरत है तो मैं अपना जवाब हटाने वाला नहीं हूं।

+0

मैं MySQL का उपयोग कर रहा हूं, लेकिन आपके उत्तर के लिए धन्यवाद। यदि गलत नहीं है, तो MySQL में यह MINUS के बजाय यूनियन होना चाहिए। एक बार फिर धन्यवाद!जहां तक ​​मुझे पता है, – paperclip

+0

@paperclip, 'यूनियन' तालिकाओं से पंक्तियों को जोड़ती है और डुप्लिकेट को हटा देती है। यह भिन्न है। 'MINUS' एक सेट ऑपरेशन है जो किसी अन्य सेट में प्रत्येक समान पंक्ति के लिए सेट से एक पंक्ति को हटा देता है। '(ए, बी, सी) यूनियन (सी, डी)' '(ए, बी, सी, डी)' देता है। लेकिन '(ए, बी, सी) मिनस (सी, डी)' रिटर्न '(ए, बी)'। आप सिर्फ एक दूसरे के साथ प्रतिस्थापित नहीं कर सकते हैं, आपको चयन विवरणों को महत्वपूर्ण रूप से बदलना होगा। – toniedzwiedz

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

मुझे आपका बयान समझ में नहीं आता है। टेबल 2 कहां से आता है? – paperclip

+0

हाइपरलिंक तालिका के लिए यह उपनाम नाम है! क्योंकि मैंने अपनी क्वेरी में एक से अधिक बार हाइपरलिंक तालिका का उपयोग किया था, इसलिए मुझे इसके लिए उपनाम नाम का उपयोग करना होगा। मैंने test1 और test2 का उपयोग किया। आप किसी भी नाम का उपयोग कर सकते हैं जो आप चाहते हैं! – Azade

+0

ओह मुझे अब मिल गया। :) – paperclip

संबंधित मुद्दे