निम्नलिखित उदाहरण पर विचार करें, जहां हमारे पास तीन संबंधित टेबल हैं। आदेश, उपयोगकर्ता, और ऑर्डरडेल। ऑर्डरडेलेट्स विदेशी कुंजियों के साथ आदेश तालिका और उपयोगकर्ता तालिका से जुड़ा हुआ है। यह मूल रूप से संबंधपरक डेटाबेस के लिए एक बहुत ही विशिष्ट सेटअप है; यकीनन एक संबंधपरक डीबीएमएस का संपूर्ण उद्देश्य ।
USE tempdb;
IF OBJECT_ID(N'dbo.OrderDetails', N'U') IS NOT NULL
DROP TABLE dbo.OrderDetails;
IF OBJECT_ID(N'dbo.Orders', N'U') IS NOT NULL
DROP TABLE dbo.Orders;
IF OBJECT_ID(N'dbo.Users', N'U') IS NOT NULL
DROP TABLE dbo.Users;
CREATE TABLE dbo.Orders
(
OrderID int NOT NULL
CONSTRAINT OrderTestPK
PRIMARY KEY
CLUSTERED
, SomeOrderData varchar(1000)
CONSTRAINT Orders_somedata_df
DEFAULT (CRYPT_GEN_RANDOM(1000))
);
CREATE TABLE dbo.Users
(
UserID int NOT NULL
CONSTRAINT UsersPK
PRIMARY KEY
CLUSTERED
, SomeUserData varchar(1000)
CONSTRAINT Users_somedata_df
DEFAULT (CRYPT_GEN_RANDOM(1000))
);
CREATE TABLE dbo.OrderDetails
(
OrderDetailsID int NOT NULL
CONSTRAINT OrderDetailsTestPK
PRIMARY KEY
CLUSTERED
, OrderID int NOT NULL
CONSTRAINT OrderDetailsOrderID
FOREIGN KEY
REFERENCES dbo.Orders(OrderID)
, UserID int NOT NULL
CONSTRAINT OrderDetailsUserID
FOREIGN KEY
REFERENCES dbo.Users(UserID)
, SomeOrderDetailsData varchar(1000)
CONSTRAINT OrderDetails_somedata_df
DEFAULT (CRYPT_GEN_RANDOM(1000))
);
INSERT INTO dbo.Orders (OrderID)
SELECT TOP(100) ROW_NUMBER() OVER (ORDER BY (SELECT NULL))
FROM sys.syscolumns sc;
INSERT INTO dbo.Users (UserID)
SELECT TOP(100) ROW_NUMBER() OVER (ORDER BY (SELECT NULL))
FROM sys.syscolumns sc;
INSERT INTO dbo.OrderDetails (OrderDetailsID, OrderID, UserID)
SELECT TOP(10000) ROW_NUMBER() OVER (ORDER BY (SELECT NULL))
, o.OrderID
, u.UserID
FROM sys.syscolumns sc
CROSS JOIN dbo.Orders o
CROSS JOIN dbo.Users u
ORDER BY NEWID();
CREATE INDEX OrderDetailsOrderID ON dbo.OrderDetails(OrderID);
CREATE INDEX OrderDetailsUserID ON dbo.OrderDetails(UserID);
यहां, हम ऑर्डरडेटा टेबल की क्वेरी कर रहे हैं, जहां UserID 15 है:
SELECT od.OrderDetailsID
, o.OrderID
, u.UserID
FROM dbo.OrderDetails od
INNER JOIN dbo.Users u ON u.UserID = od.UserID
INNER JOIN dbo.Orders o ON od.OrderID = o.OrderID
WHERE u.UserID = 15
क्वेरी से आउटपुट जैसा दिखता है:
╔════════════════╦═════════╦════════╗
║ आर्डरडाइट्स ails आर्डरिड ║ यूजरआईडी ails
╠════════════════╬═════════╬════════╣
║ 2200115 ║ 2 ║ 15 ║
║ 630215 ║ 3 ║ 15 ║
║ 1990215 ║ 3 ║ 15 ║
15 4960215 ║ 3 ║ 15 15
║ 100715 ║ 8 ║ 15 ║
15 3930815 ║ 9 ║ 15 15
║ 6310815 ║ 9 ║ 15 ║
║ 4441015 ║ 11 ║ 15 ║
║ 2171315 ║ 14 ║ 15 ║
15 3431415 ║ 15 ║ 15 15
15 4571415 15 15 ║ 15 15
15 6421515 ║ 16 ║ 15 15
15 2271715 15 18 ║ 15 15
15 2601715 15 18 ║ 15 15
15 3521715 15 18 ║ 15 15
║ 221815 ║ 19 ║ 15 ║
15 3381915 ║ 20 ║ 15 15
15 4471915 15 20 ║ 15 15
╚════════════════╩═════════╩════════╝
जैसा कि आप देख सकते हैं, आदेश आउटपुट तालिका में पंक्तियों के क्रम से मेल नहीं खाता है।
एक स्पष्ट ORDER BY
सुनिश्चित करने वाली पंक्तियों को जोड़ना ग्राहक को वांछित क्रम में वापस कर दिया जाएगा:
SELECT od.OrderDetailsID
, o.OrderID
, u.UserID
FROM dbo.OrderDetails od
INNER JOIN dbo.Users u ON u.UserID = od.UserID
INNER JOIN dbo.Orders o ON od.OrderID = o.OrderID
WHERE u.UserID = 15
ORDER BY od.OrderDetailsID;
╔════════════════╦═════════╦════════╗
║ आर्डरडाइट्स ails आर्डरिड ║ यूजरआईडी ails
╠════════════════╬═════════╬════════╣
║ 3915 ║ 40 ║ 15 ║
║ 100715 ║ 8 ║ 15 ║
║ 221815 ║ 19 ║ 15 ║
║ 299915 ║ 100 ║ 15 ║
║ 368215 ║ 83 ║ 15 ║
║ 603815 ║ 39 ║ 15 ║
║ 630215 ║ 3 ║ 15 ║
║ 728515 ║ 86 ║ 15 ║
║ 972215 ║ 23 ║ 15 ║
║ 992015 ║ 21 ║ 15 ║
║ 1017115 ║ 72 ║ 15 ║
║ 1113815 15 39 ║ 15 15
╚════════════════╩═════════╩════════╝
यदि पंक्तियों का क्रम अत्यावश्यक है, और आपके इंजीनियर जानते हैं कि आदेश अत्यावश्यक है, तो उन्हें केवल एक कथन का उपयोग करना चाहिए ORDER BY
, क्योंकि यह गलत क्रम से संबंधित विफलता होने पर उन्हें उनके पदनाम के लिए खर्च करना पड़ सकता है।
एक दूसरा, शायद अधिक शिक्षाप्रद उदाहरण, OrderDetails
ऊपर से तालिका का उपयोग करते हुए , जहां हम किसी अन्य तालिका में शामिल नहीं हो रहे हैं , लेकिन ऑर्डर और उपयोगकर्ता दोनों से मेल खाते पंक्तियों को खोजने के लिए एक सरल आवश्यकता है, हम समस्या देखते हैं।
यदि आप किसी भी तरह से महत्वपूर्ण हैं (जब यह नहीं है) तो हम क्वेरी का समर्थन करने के लिए एक इंडेक्स बनाएंगे, जैसा कि आप वास्तविक जीवन में करेंगे।
CREATE INDEX OrderDetailsOrderIDUserID ON dbo.OrderDetails(OrderID, UserID);
यहाँ प्रश्न है:
SELECT od.OrderDetailsID
FROM dbo.OrderDetails od
WHERE od.OrderID = 15
AND (od.UserID = 21 OR od.UserID = 22)
और परिणाम:
╔════════════════╗
Ails ऑर्डरडेलेट्सआईडी ails
╠════════════════╣
║ 21421 ║
21 5061421 21
21 7091421 21
║ 691422 ║
22 3471422 22
22 7241422 22
╚════════════════╝
एक ORDER BY
क्लॉज जोड़ना निश्चित रूप से सुनिश्चित करेगा कि हमें यहां सही प्रकार मिले, भी।
ये मॉक-अप केवल सरल उदाहरण हैं जहां पंक्तियों को स्पष्ट ORDER BY
विवरण के बिना "क्रम में" होने की गारंटी नहीं है । इस तरह के कई और उदाहरण हैं, और चूंकि डीबीएमएस इंजन कोड काफी बार बदलता है, इसलिए समय के साथ विशिष्ट व्यवहार बदल सकता है।