SQL में किसी भी व्यंजक को केवल एक पंक्ति में (उपश्रेणियों को छोड़कर) स्तंभों का संदर्भ देना चाहिए।
एक JOIN
परिणाम सेट की एक पंक्ति में दो अलग-अलग पंक्तियों को बनाने के लिए इस्तेमाल किया जा सकता है।
तो आप सेल्फ़-जॉइन करके विभिन्न पंक्तियों के मानों की तुलना कर सकते हैं। यहां एक उदाहरण दिया गया है जो दिखाता है कि प्रत्येक पंक्ति को एक ही क्लाइंट से जुड़ी हर दूसरी पंक्ति से जोड़ा जाता है (एक पंक्ति को स्वयं से जोड़ने को छोड़कर):
SELECT c1.*, c2.*
FROM client c1
JOIN client c2 ON (c1.clientID = c2.clientID AND c1.id <> c2.id)
अब आप कॉलम की तुलना करने वाले भाव लिख सकते हैं। उदाहरण के लिए, उपरोक्त क्वेरी को उन तक सीमित करने के लिए जहां फ़ील्ड 1 भिन्न है:
SELECT c1.*, c2.*
FROM client c1
JOIN client c2 ON (c1.clientID = c2.clientID AND c1.id <> c2.id)
WHERE c1.field1 <> c2.field1;
आप यह निर्दिष्ट नहीं करते कि आपको किस प्रकार की तुलना करने की आवश्यकता है, इसलिए मैं इसे आप पर छोड़ता हूँ। मुख्य बिंदु यह है कि सामान्य तौर पर, आप किसी तालिका में पंक्तियों की तुलना करने के लिए सेल्फ-जॉइन का उपयोग कर सकते हैं।
अपनी टिप्पणियां और स्पष्टीकरण दें:ठीक है, तो आपका "अंतर" केवल मूल्य से नहीं बल्कि पंक्ति की क्रमिक स्थिति से है। याद रखें कि रिलेशनल डेटाबेस में पंक्ति संख्या की अवधारणा नहीं होती है, उनके पास केवल कुछ क्रम के संबंध में पंक्तियों का क्रम होता है जिसे आपको ORDER BY
में निर्दिष्ट करना होगा। खंड। "id
. को भ्रमित न करें "पंक्ति संख्या के साथ छद्मकी, संख्याओं को केवल उनके कार्यान्वयन के संयोग से एकरस रूप से बढ़ते हुए असाइन किया जाता है।
SET @clientid = -1, @field1 = '';
SELECT id, clientId, field1, @clientid, @field1,
IF(@clientid <> clientid,
((@clientid := clientid) AND (@field1 := field1)) = NULL,
IF (@field1 <> field1,
(@field1 := field1),
NULL
)
) AS field1_changed
FROM client c
ORDER BY clientId, id;
ध्यान दें कि यह समाधान वास्तव में केवल सादे SQL के साथ सभी पंक्तियों का चयन करने से अलग नहीं है, और जब आप पंक्तियाँ लाते हैं तो एप्लिकेशन चर के साथ मानों को ट्रैक करना।