এসকিউএল ইউনিয়ন দিয়ে অর্ডার কিভাবে?


201

যখন অনেকগুলি নির্বাচন থেকে ডেটা আসে এবং একসাথে মিলিত হয় তখন অর্ডার দেওয়া সম্ভব? যেমন

Select id,name,age
From Student
Where age < 15
Union
Select id,name,age
From Student
Where Name like "%a%"

আমি এই প্রশ্নের নামটি কীভাবে অর্ডার করতে পারি।

কেউ কেউ বলেছিল আপনি এ জাতীয় চেহারা জিজ্ঞাসা করতে পারেন।

Select id,name,age
From Student
Where age < 15 or name like "%a%"
Order by name

তবে এই ক্ষেত্রে আমি কেবল সেই সমাধানটিকে অগ্রাহ্য করি।


1
ইউনিয়ন ক্যোয়ারিতে যদি আপনার একই কলাম থাকে তবে শেষে আপনার কলামের নাম অনুসারে অর্ডার দিন।
অনির্বাণ করক

উত্তর:


266

শুধু লেখো

Select id,name,age
From Student
Where age < 15
Union
Select id,name,age
From Student
Where Name like "%a%"
Order by name

অর্ডার সম্পূর্ণ ফলাফলসেটে প্রয়োগ করা হয়


45
আমি চাই যদি বাছাইটি কেবলমাত্র ইউনিয়ন শীর্ষের একটিতে প্রয়োগ করা হয়?
মারিফ্রাহমান

7
@marifrahman আমার উত্তর দেখুন stackoverflow.com/a/43855496/2340825
বিএ TabNabber

2
@ মরিফ্রাহমান একটি পুরানো বিষয় খননের জন্য দুঃখিত, তবে এটি অন্যকে সাহায্য করতে পারে। আপনি যদি চান যে অর্ডার বাই দ্বারা ইউনিয়নটির প্রথম অংশে প্রয়োগ করা যায় তবে এই নির্বাচনটি প্রথম বন্ধনী দ্বারা সুরক্ষিত করুন।
লিডেলন কিয়োকু

82
Select id,name,age
from
(
   Select id,name,age
   From Student
   Where age < 15
  Union
   Select id,name,age
   From Student
   Where Name like "%a%"
) results
order by name

46
যেমন বার্ড_কে উল্লেখ করেছে, সংজ্ঞা অনুসারে, একটি ইউনিয়ন গঠন করা পৃথক SELECTs দ্বারা কোনও ধারা দ্বারা অর্ডার ধারণ করার অনুমতি নেই। একমাত্র অর্ডার ধারা দ্বারা অনুমোদিত ইউনিয়নটির শেষে এবং এটি সমগ্র ইউনিয়নটির জন্য প্রযোজ্য,xxx UNION yyy ORDER BY zzz(xxx UNION yyy) ORDER BY zzz
নিকোলাস কেরি

39

বাছাইটি কেবলমাত্র ইউএনইউনের প্রথম বিবৃতিতে প্রয়োগের জন্য, আপনি এটি ইউনিয়ন সমস্তের সাথে উপ-সাবলেক্টে রাখতে পারেন (এগুলি উভয়ই ওরাকলে প্রয়োজনীয় বলে মনে হচ্ছে):

Select id,name,age FROM 
(    
 Select id,name,age
 From Student
 Where age < 15
 Order by name
)
UNION ALL
Select id,name,age
From Student
Where Name like "%a%"

অথবা (নিকোলাস কেরির মন্তব্যে সম্বোধন করা) আপনি শীর্ষ SELECT আদেশের গ্যারান্টি দিতে পারবেন এবং ফলাফলগুলি নীচের অংশে SEPL এর উপরে প্রদর্শিত হবে:

Select id,name,age, 1 as rowOrder
From Student
Where age < 15
UNION
Select id,name,age, 2 as rowOrder
From Student
Where Name like "%a%"
Order by rowOrder, name

4
হ্যাঁ. এটি সাবলেটকের ফলাফলগুলি অর্ডার করে। এটি selectযে সাবলেটকে উল্লেখ করে বিবৃতিটির ফলাফল অর্ডার করে না । এসকিউএল স্ট্যান্ডার্ড অনুযায়ী, ফলাফলের ক্রম একটি সুস্পষ্ট order byধারা বাদ দিয়ে অপরিজ্ঞাত। এটি selectআপনার উদাহরণের প্রথমটি সম্ভবত সাব-সাবলেট দ্বারা ফেরত ক্রমে এর ফলাফলগুলি প্রদান করে, তবে এটির নিশ্চয়তা নেই is তদ্ব্যতীত, এটি সম্পূর্ণরূপে ফলাফলের আদেশের ( মান হিসাবে একই নিয়ম) গ্যারান্টি দেয় না *union । আপনি যদি আদেশের উপর নির্ভর করে থাকেন তবে আপনি - শেষ পর্যন্ত - কামড় পাবেন।
নিকোলাস কেরি

1
@ নিকোলাস কেরি - যখন আমি প্রথমে কোনও ইউনিয়ন ব্যবহার করে পরীক্ষা করেছিলাম যখন এটি আপনি বর্ণিত হিসাবে অনাকাঙ্ক্ষিত আচরণ করছিল, আমি মনে করি ইউনিয়ন সমস্ত (কমপক্ষে ওরাকলে) নীচের উপরে শীর্ষ নির্বাচন করার আদেশ দিতে হয়েছিল। তবে আমি এমন একটি বিকল্প সরবরাহ করেছি যা সঠিক ক্রমটির গ্যারান্টি দেয় এবং এটি ডাটাবেসের স্বতন্ত্র হওয়া উচিত।
বিএ তাবনাবার

আমার জন্য কাজ করছে না। ইউনিয়ন সমস্তর সাথে একটি এখনও প্রথমটির মধ্যে অর্ডার বজায় রাখতে ব্যর্থ SELECT
অমিত চিগদানি

এবং দ্বিতীয় ক্যোয়ারিতে সমস্যাটি হ'ল, এটি সদৃশ রেকর্ডগুলি সরিয়ে দেয় না। কারণ আপনি অন্য কলাম 'রোউর্ডার' যুক্ত করেছেন যার সদৃশ রেকর্ডগুলির বিপরীতে আলাদা মান থাকতে পারে। ইউনিয়ন সমস্তের বিরুদ্ধে ইউনিয়নের উদ্দেশ্য হারিয়ে গেছে।
অমিত চিগদানি

1
@ অমিতচিগদানি ডুপ্লিকেট অপসারণ মূল প্রশ্নের অংশ ছিল না, তবে এটি করার জন্য স্বতন্ত্রতাগুলি নিশ্চিত করার জন্য যেখানে দফায় সংশোধন করা যেতে পারে। উদাহরণস্বরূপ: যেখানে নাম "% a%" এবং বয়স> = 15
বিএ ট্যাবনাবার

12

অন্য দুটি উত্তরই সঠিক, তবে আমি মনে করি এটি লক্ষ্য করার মতো যে আমি যে জায়গায় আটকেছি সে জায়গাটি অনুধাবন করা হয়নি যে আপনার ওরফে দ্বারা আদেশের প্রয়োজন হবে এবং নিশ্চিত হয়ে নিন যে উভয় নির্বাচনের জন্যই উপন্যাসটি একই রকম ... তাই

select 'foo'
union
select item as `foo`
from myTable
order by `foo`

লক্ষ্য করুন যে আমি প্রথম নির্বাচনের ক্ষেত্রে একক উদ্ধৃতি ব্যবহার করছি তবে অন্যদের জন্য ব্যাকটিক্স।

এটি আপনার প্রয়োজনীয় বাছাই করে নেবে।


প্রথমটিতে একক উদ্ধৃতি এবং অন্যটিতে ব্যাকটিক ব্যবহার করে আপনি কী গুরুত্বপূর্ণ? আদর্শভাবে এটি সামঞ্জস্যপূর্ণ হওয়া উচিত।
ন্যানোসফ্ট

প্রথম নির্বাচনটি আক্ষরিক; এটি 'NAMES' এর মতো শিরোনাম। দ্বিতীয় নির্বাচনটি একটি টেবিলের রেফারেন্স। সুতরাং আপনার প্রথম সারিতে "NAMES" বলবে এবং সারিগুলির বাকী অংশটি সারণী থেকে নির্বাচিত প্রকৃত নাম হবে। মুল বক্তব্যটি হ'ল আপনার শিরোনামটি খুব ভালভাবে আপনি যে কলামটি নির্বাচন করছেন তার কলামের নামের মতোই একই স্ট্রিং হতে পারে এবং এটি আপনার ইউনিয়নে সংঘর্ষ না ঘটলে আপনি যে লেবেলটি চান তা ব্যবহার করার সমাধান এটি।
ইয়েজগেনি সিমকিন

2
কিছু পরীক্ষা-নিরীক্ষার পরে আমি দেখতে পাচ্ছি যে অর্ডার বাই দফায় উল্লিখিত উপনামটি অবশ্যই নির্বাচন বিভাগে উল্লেখ করা উচিত। আপনি অন্য কলাম অনুসারে বাছাই করতে পারবেন না। আপনি SELECT a, b, c FROM (<insert union query here>) AS x;যদি সত্যই অতিরিক্ত কলামটি ফিরিয়ে এড়াতে চান তবে অবশ্যই পুরো জিনিসটি মোড়কের মাধ্যমে আপনি এটি ঘিরে কাজ করতে পারেন ।
Wodin

11

Order Byপরে প্রয়োগ করা হয় union, সুতরাং কেবলমাত্র order byবিবৃতিগুলির শেষে একটি ধারা যুক্ত করুন :

Select id,name,age
From Student
Where age < 15
Union
Select id,name,age
From Student
Where Name like '%a%'
Order By name

9

আমি চাই যদি বাছাইটি ইউনিয়নটির কেবল একটিতে প্রয়োগ করা হয় তবে সমস্ত ইউনিয়ন ব্যবহার করুন:

Select id,name,age
From Student
Where age < 15
Union all
Select id,name,age
From 
(
Select id,name,age
From Student
Where Name like "%a%"
Order by name
)

8

অন্যান্য উত্তরের হিসাবে যেমন বলা হয়েছে, 'শেষ আদেশের পরে' ইউনিয়নের মাধ্যমে যোগদান করা উভয় ডেটাসেটের ক্ষেত্রে আবেদন করা উচিত।

আমার কাছে দুটি ডেটা সেট ছিল তবে বিভিন্ন টেবিল তবে একই কলামগুলি ব্যবহার করা হয়েছিল। শেষ ইউনিয়ন এখনও কাজ না করার পরে 'অর্ডার বাই'। কমান্ডের জন্য 'ক্রম দ্বারা' ব্যবহৃত কলামের জন্য ALIAS ব্যবহার করে কৌতুকটি হয়েছিল।

Select Name, Address for Employee 
Union
Select Customer_Name, Address from Customer
order by customer_name;   --Won't work

সুতরাং সমাধানটি হ'ল আলিয়া ব্যবহারকারীর নাম ':

Select Name as User_Name, Address for Employee 
Union
Select Customer_Name as User_Name, Address from Customer
order by User_Name; 

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.