Database
 sql >> डेटाबेस >  >> RDS >> Database

SQL जॉइन के लिए आपका अंतिम गाइड:क्रॉस जॉइन - भाग 3

क्रॉस जॉइन सुर्खियों में है। यह लेख SQL जॉइन-संबंधित प्रकाशनों की हमारी छोटी श्रृंखला को समाप्त करता है। यदि आप पिछले दो लेखों से चूक गए हैं, तो उन्हें इस प्रकार देखें:

  • एसक्यूएल जॉइन के लिए आपकी अंतिम गाइड - भाग 1:इनर जॉइन
  • एसक्यूएल जॉइन के लिए आपकी अंतिम गाइड - भाग 2:बाहरी जॉइन

SQL सर्वर क्रॉस जॉइन सभी जॉइन में सबसे सरल है। यह बिना किसी जॉइन कंडीशन के 2 टेबल के संयोजन को लागू करता है। यदि आपके पास एक तालिका में 5 पंक्तियाँ हैं और दूसरी में 3 पंक्तियाँ हैं, तो आपको 15 संयोजन मिलते हैं। एक अन्य परिभाषा कार्टेशियन उत्पाद है।

अब, आप बिना किसी जॉइन कंडीशन के टेबल को क्यों जोड़ना चाहेंगे? थोड़ा रुकिए क्योंकि हम वहां पहुंच रहे हैं। सबसे पहले, आइए सिंटैक्स को देखें।

एसक्यूएल क्रॉस सिंटेक्स में शामिल हों

इनर जॉइन की तरह, आप 2 मानकों, SQL-92 और SQL-89 से क्रॉस जॉइन कर सकते हैं। टी-एसक्यूएल दोनों सिंटैक्स का समर्थन करता है, लेकिन मैं एसक्यूएल-92 पसंद करता हूं। यदि आप जानना चाहते हैं कि ऐसा क्यों है, तो INNER JOIN को समर्पित भाग 1 देखें।

SQL-92 सिंटैक्स

SELECT
 a.column1
,b.column2
FROM Table1 a
CROSS JOIN Table2 b

एसक्यूएल-89

SELECT
 a.column1
,b.column2
FROM Table1 a, Table2 b 

बहुत कुछ SQL-89 की तरह - INNER JOIN बिना जॉइन कंडीशन के।

5 SQL सर्वर क्रॉस जॉइन का उपयोग करने के उदाहरण

आपको आश्चर्य हो सकता है कि आप SQL क्रॉस जॉइन का उपयोग कब कर सकते हैं। बेशक, यह मूल्य संयोजनों को आकार देने के लिए उपयोगी है। और क्या?

<एच3>1. परीक्षण डेटा

यदि आपको बड़ी मात्रा में डेटा की आवश्यकता है, तो क्रॉस जॉइन आपकी सहायता करेगा। उदाहरण के लिए, आपके पास विक्रेताओं और उत्पादों की एक तालिका है। एक अन्य तालिका में वे उत्पाद हैं जो विक्रेता प्रदान करता है। यदि यह खाली है और आपको शीघ्रता से डेटा की आवश्यकता है, तो आप यह कर सकते हैं:

SELECT
 P.ProductID
,v.BusinessEntityID AS VendorID
FROM 
Production.Product p
CROSS JOIN Purchasing.Vendor v 

इसने AdventureWorks . की मेरी कॉपी में 52,416 रिकॉर्ड बनाए . यह ऐप्स और प्रदर्शन का परीक्षण करने के लिए पर्याप्त है। हालांकि, यदि आप अपने ऐप को उपयोगकर्ताओं के सामने प्रस्तुत करते हैं, तो हमारे उदाहरण के इस डेटा के बजाय अपने स्रोत का उपयोग करें।

<एच3>2. अनुपलब्ध संयोजनों से परिणाम प्राप्त करना

पिछले लेख में, हमने लापता मूल्यों से परिणाम प्राप्त करने के लिए OUTER JOIN के उपयोग का वर्णन किया था। इस बार, हम छूटे हुए संयोजनों का उपयोग करेंगे। आइए उन उत्पादों को प्राप्त करने का प्रयास करें जहां स्टोर 294 ने पैसा नहीं कमाया।

-- get store 294 ('Professional Sales and Service') list of products without sales orders for January 2014
SELECT DISTINCT
 b.Name AS Product
FROM Sales.Store a
CROSS JOIN Production.Product b
LEFT JOIN (SELECT
	     c.StoreID
	    ,a.ProductID
	    ,SUM(a.LineTotal) AS OrderTotal
	    FROM Sales.SalesOrderDetail a
	    INNER JOIN Sales.SalesOrderHeader b ON a.SalesOrderID = b.SalesOrderID
	    INNER JOIN Sales.Customer c ON b.CustomerID = c.CustomerID
	    WHERE c.StoreID = 294 AND
		   b.OrderDate BETWEEN '01/01/2014' AND '01/31/2014'
	    GROUP BY c.StoreID, a.ProductID) d ON a.BusinessEntityID = d.StoreID 
		                                AND b.ProductID = d.ProductID
WHERE d.OrderTotal IS NULL
AND a.BusinessEntityID = 294
ORDER BY b.Name 

जैसा कि आप देख सकते हैं, हमें सबसे पहले सभी उत्पाद और स्टोर संयोजनों की आवश्यकता है - हम क्रॉस जॉइन का उपयोग करते हैं। फिर, हमें जनवरी 2014 की अवधि के लिए बेचे गए उत्पादों की एक सूची चाहिए। अंत में, उस सूची में लेफ्ट जॉइन लागू करें और बिक्री के बिना केवल उत्पादों को प्राप्त करने के लिए WHERE क्लॉज का उपयोग करें। फिर, हमें उन उत्पादों के बारे में जानकारी मिलती है जो बेचे नहीं गए थे।

<एच3>3. अक्षरों के संयोजन से शब्द बनाना

यदि आप अक्षर संयोजन के साथ शब्द खेल में हैं, तो आप स्वयं-जुड़ने के साथ क्रॉस जॉइन का उपयोग कर सकते हैं। यहां 3 अक्षरों 'D', 'O' और 'G' का उपयोग करने वाला एक नमूना दिया गया है।


DECLARE @table TABLE(letter CHAR(1) NOT NULL)

INSERT INTO @table
VALUES ('D'),('O'),('G')

SELECT
 a.letter
,b.letter
,c.letter
FROM @table a
CROSS JOIN @table b
CROSS JOIN @table c
WHERE a.letter + b.letter + c.letter LIKE '%O%'

WHERE क्लॉज के बिना एक समान कोड 27 रिकॉर्ड उत्पन्न करेगा। WHERE क्लॉज ने 'डीडीडी' या 'जीजीजी' जैसे 3 समान अक्षर संयोजनों के संयोजन को खत्म करने में मदद की। नीचे परिणाम है।

बेशक, चूंकि मैंने क्वेरी में ज्यादा समझदारी नहीं डाली, इसलिए अधिकांश परिणाम गैर-शब्द हैं। फिर भी, यह खेल के सोचने वाले हिस्से में मदद करता है।

<एच3>4. भोजन के सुझाव

हम सभी को खाना बहुत पसंद होता है, लेकिन सही संयोजन चुनना मुश्किल हो सकता है। जैसा कि पिछले उदाहरण अवधारणाओं में है, यहां बताया गया है कि संभावित भोजन संयोजन कैसे प्राप्त करें:


DECLARE @FoodMenu TABLE(FoodItem VARCHAR(50) NOT NULL, ItemType CHAR(1) NOT NULL)

-- main course
INSERT INTO @FoodMenu
VALUES
('Spaghetti with Meatballs','M'),
('Spaghetti with Fried Chicken','M'),
('Rice with Roasted Chicken','M')

-- side dish
INSERT INTO @FoodMenu
VALUES
('Buttered Corn and Carrots','S'),
('French Fries','S'),
('Vegetable Coleslaw','S')

-- drinks
INSERT INTO @FoodMenu
VALUES
('Orange Juice','D'),
('Pineapple Juice','D'),
('Soda','D')

SELECT
 a.FoodItem AS MainCourse
,b.FoodItem AS SideDish
,c.FoodItem AS Drinks
FROM @FoodMenu a
CROSS JOIN @FoodMenu b
CROSS JOIN @FoodMenu c
WHERE a.ItemType = 'M' AND
b.ItemType = 'S' AND
c.ItemType = 'D' 

परिणाम:

उनमें से कुछ वांछनीय हैं। कुछ इस तरह हैं, 'इसे भूल जाओ!' यह आपके स्वाद पर निर्भर करता है।

5. टी-शर्ट डिज़ाइन चयन

क्रॉस जॉइन का एक अन्य संभावित उपयोग शर्ट के लिए डिज़ाइन संयोजन प्राप्त करना है। यहाँ एक नमूना कोड है:


DECLARE @tshirts TABLE(attributeType CHAR(1) NOT NULL, Attribute VARCHAR(15))

--size
INSERT INTO @tshirts
VALUES
('S','Small'),
('S','Medium'),
('S','Large')

--color
INSERT INTO @tshirts
VALUES
('C','Red'),
('C','Blue'),
('C','Green'),
('C','Black'),
('C','Purple'),
('C','Yellow'),
('C','White')

--design
INSERT INTO @tshirts
VALUES
('D','Plain'),
('D','Printed')

SELECT
 a.Attribute AS Size
,b.Attribute AS Color
,c.Attribute AS Design
FROM @tshirts a
CROSS JOIN @tshirts b
CROSS JOIN @tshirts c
WHERE a.attributeType = 'S' AND
b.attributeType = 'C' AND 
c.attributeType = 'D'

और परिणाम? चित्र 3 में इसके भाग पर एक नज़र डालें:

क्या आप कुछ और उदाहरण सोच सकते हैं?

SQL सर्वर क्रॉस जॉइन परफॉर्मेंस

क्रॉस जॉइन का उपयोग करने में क्या पकड़ है? इसके लायक क्या है, अगर आप सावधान नहीं हैं तो क्रॉस जॉइन प्रदर्शन के मुद्दों का कारण बन सकता है। सबसे डरावना हिस्सा यह है कि यह 2 सेटों का उत्पाद बनाता है। इस प्रकार, WHERE क्लॉज में परिणामों को सीमित किए बिना, तालिका1 1000 रिकॉर्ड के साथ Table2 . के साथ क्रॉस जॉइन करें 1,000,000 रिकॉर्ड के साथ 1,000,000,000 रिकॉर्ड बन जाएंगे। नतीजतन, यह SQL सर्वर द्वारा पढ़ने के लिए बहुत सारे पृष्ठ हैं।

उदाहरण के तौर पर, AdventureWorks . में पुरुष और महिला कर्मचारियों की जोड़ी बनाने पर विचार करें ।

USE AdventureWorks
GO

SELECT
 P.LastName + ISNULL(' ' + p.Suffix,'') + ', ' + P.FirstName + ISNULL(' ' + P.MiddleName,'') AS Male
,P1.LastName + ISNULL(' ' + p1.Suffix,'') + ', ' + P1.FirstName + ISNULL(' ' + P1.MiddleName,'') AS Female
FROM HumanResources.Employee e
INNER JOIN Person.Person p ON e.BusinessEntityID = P.BusinessEntityID
CROSS JOIN HumanResources.Employee e1
INNER JOIN Person.Person p1 ON e1.BusinessEntityID = p1.BusinessEntityID
WHERE e.Gender = 'M'
AND e1.Gender = 'F' 

उपरोक्त कोड आपको पुरुष और महिला कर्मचारियों के सभी संभावित जोड़े देता है। मुझे केवल 17,304 रिकॉर्ड मिले, लेकिन चित्र 4 में तार्किक पठन को देखें:

क्या आपने व्यक्ति . का तार्किक पाठ देखा टेबल? वह 53,268 x 8KB पृष्ठ पढ़ रहा है! वर्कटेबल . का उल्लेख नहीं करना चाहिए तार्किक पठन tempdb . में किया जाता है ।

निष्कर्ष? सांख्यिकी IO की जाँच करें, और यदि यह आपको बड़ी तार्किक रीडिंग देखने में परेशानी होती है, तो एक प्रश्न को अलग तरीके से व्यक्त करें। WHERE क्लॉज या डिवाइड-एंड-कॉनकॉर दृष्टिकोण में अतिरिक्त शर्तें मदद कर सकती हैं।

जब क्रॉस जॉइन एक इनर जॉइन बन जाता है

हाँ यह सही है। SQL सर्वर एक क्रॉस जॉइन को इनर जॉइन के रूप में संसाधित कर सकता है। हमने पहले उल्लेख किया है कि जब एक राइट जॉइन को लेफ्ट जॉइन के रूप में प्रोसेस किया जाता है, तो यह क्रॉस जॉइन पर लागू हो सकता है। नीचे दिए गए कोड पर एक नज़र डालें:

SELECT
 c.CustomerID
,c.AccountNumber
,P.BusinessEntityID
,P.LastName
,P.FirstName
FROM Sales.Customer c
CROSS JOIN Person.Person p
WHERE c.PersonID = P.BusinessEntityID 

इससे पहले कि हम एक्ज़ीक्यूशन प्लान देखें, आइए इनर जॉइन के समकक्ष लें।

SELECT
 c.CustomerID
,c.AccountNumber
,P.BusinessEntityID
,P.LastName
,P.FirstName
FROM Sales.Customer c
INNER JOIN Person.Person p ON c.PersonID = P.BusinessEntityID 

अब, नीचे निष्पादन योजना देखें।

शीर्ष योजना क्रॉस जॉइन का उपयोग कर क्वेरी है। नीचे की योजना एक इनर जॉइन का उपयोग कर क्वेरी है। उनके पास वही QueryHashPlan . है ।

क्या आपने देखा हैश मैच शीर्ष योजना के संचालक? यह एक इनर जॉइन है। लेकिन हमने कोड में क्रॉस जॉइन का इस्तेमाल किया। पहली क्वेरी में WHERE क्लॉज (WHERE c.PersonID =P.BusinessEntityID ) परिणामों को केवल समान कुंजियों के साथ संयोजन करने के लिए मजबूर करता है। तो, तार्किक रूप से यह एक इनर जॉइन है।

कौन एक बेहतर है? यह आपकी व्यक्तिगत पसंद है। मैं इनर जॉइन पसंद करता हूं क्योंकि इरादा समान कुंजी के साथ 2 टेबल में शामिल होना है। INNER JOIN का उपयोग करना इसे बहुत स्पष्ट करता है। लेकिन वह सिर्फ मैं हूं।

निष्कर्ष

क्रॉस जॉइन आपको हर संभव मूल्य संयोजन देने के लिए अच्छा है। हालाँकि, आपको चेतावनी दी गई है कि यह किसी प्रकार के डेटा "विस्फोट" का कारण बन सकता है। इस जॉइन का उपयोग सावधानी से करें। जितना हो सके परिणाम सीमित करें। साथ ही, आप एक क्रॉस जॉइन लिख सकते हैं जो कार्यात्मक रूप से इनर जॉइन के बराबर है।

यह आलेख SQL जॉइन के बारे में श्रृंखला समाप्त करता है। भविष्य के संदर्भों के लिए, आप इस लेख को बुकमार्क कर सकते हैं। या, इसे ब्राउज़र में अपने संग्रह में जोड़ें।

और इस लेख को अपने पसंदीदा सोशल मीडिया पर शेयर करना न भूलें?


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. एसक्यूएल तुलना ऑपरेटर

  2. ऑफ़लाइन रीऑर्ग विज़ार्ड का उपयोग करना

  3. 0 से 60 :अप्रत्यक्ष चौकियों पर स्विच करना

  4. स्रोत नियंत्रण से डेटाबेस परिनियोजित करना

  5. BYOC के लिए नई सुविधा - क्लस्टर को रोकना और फिर से शुरू करना