নিম্নলিখিত উদাহরণটি বিবেচনা করুন, যেখানে আমাদের তিনটি সম্পর্কিত সারণী রয়েছে। অর্ডার, ব্যবহারকারী এবং অর্ডারডেটেলস। অর্ডারডেটেলগুলি অর্ডার সারণিতে এবং ব্যবহারকারীদের সারণীর সাথে বিদেশী কীগুলির সাথে যুক্ত। এটি মূলত রিলেশনাল ডাটাবেসের জন্য খুব সাধারণ সেটআপ; যুক্তিযুক্তভাবে একটি রিলেশনাল ডিবিএমএসের পুরো উদ্দেশ্য ।
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);
এখানে, আমরা অর্ডার বিবরণ টেবিলটি জিজ্ঞাসা করছি যেখানে ইউজারআইডি 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
ক্যোয়ারী থেকে আউটপুট দেখে মনে হচ্ছে:
╔════════════════╦═════════╦════════╗
║ অর্ডারডেটেলসআইডি ║ অর্ডারআইডি ║ ইউজারআইডি ║
╠════════════════╬═════════╬════════╣
00 2200115 ║ 2 ║ 15 ║ ║
║ 630215 ║ 3 ║ 15 ║ ║
║ 1990215 ║ 3 ║ 15 ║ ║
60 4960215 ║ 3 ║ 15 ║ ║
║ 100715 ║ 8 ║ 15 ║
║ 3930815 ║ 9 ║ 15 ║
10 6310815 ║ 9 ║ 15 ║
║ 4441015 ║ 11 ║ 15 ║ ║
7 2171315 ║ 14 ║ 15 ║ ║
3 3431415 ║ 15 ║ 15 ║ ║
7 4571415 ║ 15 ║ 15 ║ ║
21 6421515 ║ 16 ║ 15 ║ ║
7 2271715 ║ 18 ║ 15 ║ ║
0 2601715 ║ 18 ║ 15 ║ ║
21 3521715 ║ 18 ║ 15 ║ ║
18 221815 ║ 19 ║ 15 ║
8 3381915 ║ 20 ║ 15 ║
7 4471915 ║ 20 ║ 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;
╔════════════════╦═════════╦════════╗
║ অর্ডারডেটেলসআইডি ║ অর্ডারআইডি ║ ইউজারআইডি ║
╠════════════════╬═════════╬════════╣
║ 3915 ║ 40 ║ 15 ║
║ 100715 ║ 8 ║ 15 ║
18 221815 ║ 19 ║ 15 ║
99 299915 ║ 100 ║ 15 ║
║ 368215 ║ 83 ║ 15 ║ ║
38 603815 ║ 39 ║ 15 ║
║ 630215 ║ 3 ║ 15 ║ ║
85 728515 ║ 86 ║ 15 ║ ║
72 972215 ║ 23 ║ 15 ║ ║
║ 992015 ║ 21 ║ 15 ║ ║
17 1017115 ║ 72 ║ 15 ║
13 1113815 ║ 39 ║ 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)
এবং ফলাফল:
╔════════════════╗
║ অর্ডারডেটেলসআইডি ║
╠════════════════╣
4 21421 ║
6 5061421 ║
║ 7091421 ║
14 691422 ║
║ 3471422 ║
24 7241422 ║
╚════════════════╝
একটি ORDER BY
ধারা যুক্ত করা অবশ্যই নিশ্চিত করবে যে আমরা এখানেও সঠিক ক্রমটি পেয়েছি।
এই মক-আপগুলি কেবল সহজ উদাহরণ যেখানে সারিগুলি সুস্পষ্ট ORDER BY
বিবৃতি ব্যতীত "ক্রম" হওয়ার নিশ্চয়তা দেয় না । এর মতো আরও অনেক উদাহরণ রয়েছে এবং যেহেতু ডিবিএমএস ইঞ্জিন কোডটি বেশ ঘন ঘন পরিবর্তিত হয়, নির্দিষ্ট আচরণ সময়ের সাথে সাথে পরিবর্তিত হতে পারে।