এসকিউএল ক্যোয়ারী - ইউনিয়নের মাধ্যমে আদেশ ব্যবহার করে


83

দুটি টেবিল থেকে ডেটা টানানোর সময় একজন কীভাবে প্রোগ্রামিয়ালি ইউনিয়ন ক্যোয়ারিকে বাছাই করতে পারেন? উদাহরণ স্বরূপ,

SELECT table1.field1 FROM table1 ORDER BY table1.field1
UNION
SELECT table2.field1 FROM table2 ORDER BY table2.field1

একটি ব্যতিক্রম নিক্ষেপ

দ্রষ্টব্য: এমএস অ্যাক্সেস জেট ডাটাবেস ইঞ্জিনে এটি চেষ্টা করা হচ্ছে

উত্তর:


118

কখনও কখনও আপনার ORDER BYপ্রতিটি বিভাগে একত্রিত হওয়া দরকার UNION

এক্ষেত্রে

SELECT * FROM 
(
  SELECT table1.field1 FROM table1 ORDER BY table1.field1
) DUMMY_ALIAS1

UNION ALL

SELECT * FROM
( 
  SELECT table2.field1 FROM table2 ORDER BY table2.field1
) DUMMY_ALIAS2

4
যখন আদেশটি ফলাফল সেটকে প্রভাবিত করে (শীর্ষস্থানীয় এক্স ব্যবহার করার সময়)
জেমস ব্যারাস

ঠিক এটাই আমি খুঁজছি! ধন্যবাদ!
শ্রীচাঁদ ইয়েলা

আমার জন্য দুর্দান্ত কাজ করে ... আপনার বাইরের নির্বাচনের কোনও টেবিলের নাম আছে তা নিশ্চিত করা দরকার। আমাকে বিট।
ট্রয়

মাইক্রোসফ্ট এসকিউএল সার্ভার স্ট্যান্ডার্ড (64-বিট) সংস্করণ 11.0.5058.0 এর সাথে এই সিনট্যাক্সটি ব্যবহার করতে আমার কোনও সমস্যা হয়নি had
hlovdal

4
SSMS আপনি উপ-প্রশ্নের পরিবর্তন করতে হবে SELECT TOP 100 PERCENTব্যবহার করার জন্য ORDER BYএকটি উপ-ক্যোয়ারীতে
জোসেফ Nields

64
SELECT field1 FROM table1
UNION
SELECT field1 FROM table2
ORDER BY field1

18
আপনি প্রযুক্তিগতভাবে মূল প্রশ্নটিতে যা জিজ্ঞাসা করেছিলেন তা এই প্রযুক্তিগতভাবে সম্পাদন করে না।
ইয়ান বয়ড

4
@ ইয়ান বয়ড: আমি আপনার বক্তব্য গ্রহণ করি কিন্তু তারা যা জিজ্ঞাসা করছে তা যৌক্তিক কোনও ধারণা দেয় না: ইউনিয়ন সেট এবং সেটে পরিচালনা করে কোন আদেশ নেই!
onedaywhen

8
@ মাউন্টেউহেন মূল লেখক দুটি আদেশের ফলাফলের সেটকে সম্মতি দিতে চান। UNIONএটি হতে দেয় না। এটি করার জন্য আরও একটি নির্মাণ থাকতে পারে। নাও থাকতে পারে। যেভাবেই এই উত্তরটি প্রযুক্তিগতভাবে লেখক যা জিজ্ঞাসা করেছিলেন তা সম্পাদন করে না।
ইয়ান বয়ড

4
@ আইয়ান বয়ড: এসকিউএল, ORDER BYএকটি কার্সারের অংশ, যেখানে UNIONটেবিলগুলিতে কাজ করে, তাই তাদের কোড কাজ করতে পারে না। আপনি কীভাবে অপ্রয়োজনীয় কোড থেকে ওপির উদ্দেশ্য অনুমান করতে পারবেন তা আমি দেখতে পাচ্ছি না। বিবেচনা করুন যে এসকিউএল এর UNIONসদৃশগুলি মুছে ফেলে: এগুলি যদি আপনার "আদেশের {1, 2, 3} UNION {2, 4, 6}ফলাফলের সেটগুলি" হয় তবে ফলাফলটি হবে {1, 2, 3, 4, 6}বা {1, 3, 2, 4, 6}? আমরা জানি না কারণ "আদেশের ফলাফলের সেটগুলি" এর ইউনিয়ন এসকিউএল সম্পর্কিত অপরিজ্ঞাত এবং ওপি নির্দিষ্ট করে দেয় না।
onedaywhen

আমি এমওয়াইএসকিউএল ব্যবহার করছি, আমি সমস্ত নির্বাচিত বিবৃতিতে ক্ষেত্রটি (অর্ডারিং ক্ষেত্র) অন্তর্ভুক্ত করেছি। তারপরে কেবল শেষে অর্ডার যুক্ত করুন, আমার পক্ষে কাজ করে।
ক্রিয়েটিভম্যানিক্স

57

আমি মনে করি এটি ব্যাখ্যা করার ভাল কাজ করে।

নিম্নলিখিতটি একটি ইউনিয়ন ক্যোয়ারী যা একটি ধারা দ্বারা অর্ডার ব্যবহার করে:

select supplier_id, supplier_name
from suppliers
where supplier_id > 2000
UNION
select company_id, company_name
from companies
where company_id > 1000
ORDER BY 2;

যেহেতু কলামের নাম দুটি "সিলেক্ট" স্টেটমেন্টের মধ্যে পৃথক, তাই ফলাফলের সেটে তাদের অবস্থান অনুসারে অর্ডার বাই ক্লজে কলামগুলি উল্লেখ করা আরও সুবিধাজনক।

এই উদাহরণে, আমরা "অর্ডার বাই 2" দ্বারা চিহ্নিত হিসাবে, আরোহণের ক্রম অনুসারে supplier_name/ ফলাফলগুলি বাছাই করেছি company_name

ফলাফল ক্ষেত্রগুলিতে supplier_name/ company_nameক্ষেত্রগুলি # 2 পজিশনে রয়েছে।

এখান থেকে নেওয়া হয়েছে: http://www.techonthenet.com/sql/union.php


28

একটি কংক্রিট উদাহরণ ব্যবহার করে:

SELECT name FROM Folders ORDER BY name
UNION
SELECT name FROM Files ORDER BY name

নথি পত্র:

name
=============================
RTS.exe
thiny1.etl
thing2.elt
f.txt
tcpdump_trial_license (1).zip

ফোল্ডারগুলি:

name
============================
Contacts
Desktop
Downloads
Links
Favorites
My Documents

পছন্দসই আউটপুট: (প্রথমে প্রথমে নির্বাচিত ফলাফল, অর্থাৎ প্রথমে ফোল্ডারগুলি)

Contacts
Desktop
Downloads
Favorites
Links
My Documents
f.txt
RTMS.exe
tcpdump_trial_license (1).zip
thiny1.etl
thing2.elt

এসকিউএল পছন্দসই ফলাফলগুলি অর্জন করতে:

SELECT name 
FROM (
    SELECT 1 AS rank, name FROM Folders
    UNION 
    SELECT 2 AS rank, name FROM Files) dt
ORDER BY rank, name

4
এটি সুদূর উত্তরের উত্তর
javier_domenech

4
এটি দুর্দান্ত উত্তর!
আলী গোনবাদি

দ্রষ্টব্য - আপনাকে অবশ্যই উত্সযুক্ত টেবিলটিকে একটি উপনাম দিতে হবে (যেমন এই উদাহরণে দেখানো হয়েছে dt) বা এটি কাজ করবে না। আমি কিছুক্ষণের জন্য এতে হতবাক হয়ে গিয়েছিলাম যেহেতু আমি সেই বিবরণটি শুরু করতে বাদ দিয়েছিলাম এবং এসএসএমএসের দ্বারা প্রেরিত ত্রুটি বার্তাটি বিশেষ সহায়ক নয়।
ক্যাকটাসকেকে

17

নর্থওয়াইন্ড 2007 এর একটি উদাহরণ এখানে:

SELECT [Product ID], [Order Date], [Company Name], [Transaction], [Quantity]
FROM [Product Orders]
UNION SELECT [Product ID], [Creation Date], [Company Name], [Transaction], [Quantity]
FROM [Product Purchases]
ORDER BY [Order Date] DESC;

আপনার সমস্ত ইউনিয়ন সম্পন্ন করার পরে অর্ডার বা বিভাগের আদেশটি সর্বশেষ বিবৃতি হওয়া উচিত। আপনি বেশ কয়েকটি সেট একসাথে মিলিয়ে নিতে পারেন, তারপরে শেষ সেটটির পরে একটি অর্ডার দিয়ে দিন।


9
(SELECT table1.field1 FROM table1 
UNION
SELECT table2.field1 FROM table2) ORDER BY field1 

কাজ? মনে রাখবেন সেট। আপনি একটি ইউনিয়ন ব্যবহার করতে চান সেটটি পান এবং তারপরে আপনার ক্রিয়াকলাপ সম্পাদন করুন।


আপনি যে ক্ষেত্রগুলি বাছাই করতে চান তার ক্ষেত্রগুলির আলাদা আলাদা নামকরণ করা হয়েছে সে ক্ষেত্রে আপনি নিজের ক্রমে অর্ডিনাল মানগুলিও ব্যবহার করতে পারেন
আনসন স্মিথ


4
SELECT field1
FROM ( SELECT field1 FROM table1
       UNION
       SELECT field1 FROM table2
     ) AS TBL
ORDER BY TBL.field1

(ALIAS ব্যবহার করুন)


@ ডিসপ্লেডগুই যদি এমজির একটি প্রশ্নের আরও উত্তরের উত্তর থাকে তবে উপরের যে কোনও একটির, এবং এই ক্ষেত্রে স্বীকৃত উত্তরে স্পষ্টতই সমস্যা রয়েছে, এমজির উচিত হবে এবং আমি তাকে নতুন উত্তরগুলি ছেড়ে দিতে উত্সাহিত করব
মোবাইলমন

এবং বিটিডব্লিউ, এমজে এর উত্তর সবচেয়ে ভাল! (কমপক্ষে আমার জন্য)
মোবাইলমান

4

এটি মূর্খ জিনিস যা আমি কখনও দেখেছি তবে এটি কার্যকর হয় এবং আপনি ফলাফল নিয়ে তর্ক করতে পারবেন না।

SELECT *
FROM (
    SELECT table1.field1 FROM table1 ORDER BY table1.field1
    UNION
    SELECT table2.field1 FROM table2 ORDER BY table2.field1
) derivedTable

উদ্ভূত টেবিলের অভ্যন্তরটি নিজে থেকে চালানো হবে না, তবে একটি উত্পন্ন টেবিলটি পুরোপুরি সূক্ষ্ম হিসাবে কাজ করে। আমি এসএস 2000, এসএস 2005, এসএস ২০০৮ আর 2 এবং তিনটি কাজেই চেষ্টা করেছি।


2

এটি এভাবেই করা হয়

select * from 
    (select top 100 percent pointx, pointy from point
     where pointtype = 1
     order by pointy) A
union all
select * from 
    (select top 100 percent pointx, pointy from point
     where pointtype = 2
     order by pointy desc) B

2

এই মন্তব্য বিভাগটি ব্রাউজ করে আমি প্রশ্নের উত্তর দিয়ে দুটি পৃথক নিদর্শন পেয়েছি। দুঃখের বিষয় এসকিউএল ২০১২-এর জন্য, দ্বিতীয় প্যাটার্নটি কাজ করে না, তাই এখানে আমার "চারপাশের কাজ"


একটি সাধারণ কলামে অর্ডার করুন

এটি আপনার মুখোমুখি হওয়া সবচেয়ে সহজ কেস। অনেক ব্যবহারকারীর নির্দেশিত মত, আপনার যা করা উচিত তা হল Order Byক্যোয়ারির শেষে একটি যুক্ত করা

SELECT a FROM table1
UNION
SELECT a FROM table2
ORDER BY field1

বা

SELECT a FROM table1 ORDER BY field1
UNION
SELECT a FROM table2 ORDER BY field1

বিভিন্ন কলাম অন অর্ডার

এটি এখানে যেখানে এটি কৃপণ হয়ে ওঠে। এসকিউএল 2012 ব্যবহার করে, আমি শীর্ষ পোস্টটি চেষ্টা করেছিলাম এবং এটি কার্যকর হয় না।

SELECT * FROM 
(
  SELECT table1.field1 FROM table1 ORDER BY table1.field1
) DUMMY_ALIAS1

UNION ALL

SELECT * FROM
( 
  SELECT table2.field1 FROM table2 ORDER BY table2.field1
) DUMMY_ALIAS2

মন্তব্যে পুনঃসংশোধনের পরে আমি এটি চেষ্টা করেছি

SELECT * FROM 
(
  SELECT TOP 100 PERCENT table1.field1 FROM table1 ORDER BY table1.field1
) DUMMY_ALIAS1

UNION ALL

SELECT * FROM
( 
  SELECT TOP 100 PERCENT table2.field1 FROM table2 ORDER BY table2.field1
) DUMMY_ALIAS2

এই কোড কম্পাইল কিন্তু হয়নি DUMMY_ALIAS1এবং DUMMY_ALIAS2ওভাররাইড Order Byসালে প্রতিষ্ঠিত Selectবিবৃতি যা এই অব্যবহারযোগ্য করে তোলে।

একমাত্র সমাধান যা আমি ভাবতে পারি, এটি আমার পক্ষে কাজ করেছিল তা ইউনিয়ন ব্যবহার না করে পরিবর্তে প্রশ্নগুলি পৃথকভাবে চালানো এবং তারপরে তাদের সাথে ডিল করা। সুতরাং মূলত, Unionযখন আপনি চান একটি ব্যবহার নাOrder By


1

আলাদাভাবে অর্ডার ব্যবহার করে প্রতিটি উপসেট অর্ডার পায়, তবে পুরো সেটটি নয়, যা আপনি দুটি টেবিলকে একত্রিত করতে চান।

আপনার এই জাতীয় কিছু ব্যবহার করা উচিত এক আদেশ সেট:

SELECT TOP (100) PERCENT field1, field2, field3, field4, field5 FROM 
(SELECT table1.field1, table1.field2, table1.field3, table1.field4, table1.field5 FROM table1
UNION ALL 
SELECT table2.field1, table2.field2, table2.field3, table2.field4, table2.field5 FROM  table2) 
AS unitedTables ORDER BY field5 DESC

0

দ্বিতীয় টেবিলটি সারণিতে নামটির অন্তর্ভুক্ত করতে পারে না ORDER BY

তাই ...

SELECT table1.field1 FROM table1 ORDER BY table1.field1
UNION
SELECT table2.field1 FROM table2 ORDER BY field1

ব্যতিক্রম ছুঁড়ে না


এটা কি ভাল প্রশ্ন ছিল। আপনি কি বলতে পারবেন যে আপনার সংস্করণ বা নেস্টেড কোনও, পছন্দসই ফলাফলগুলি ফেরত দেয়? অথবা, তারা উভয়ই কি একই ফলাফল ফেরত দেয়? যদি তা হয় তবে (অন্য লোকের) নেস্টেড সমাধানটি আরও পারফরম্যান্স হতে পারে কারণ এটি কেবল একবার অর্ডার দিয়েছিল?
ডোক 21

আমি জেট ইঞ্জিনে পারফরম্যান্সের সুবিধার বিষয়ে নিশ্চিত নই, তবে আমি বলব বাসা বাঁধার কারণে পাঠযোগ্যতা বৃদ্ধি পেয়েছে।
কার্টিস ইন্ডারভিচে 21


0
(SELECT FIELD1 AS NEWFIELD FROM TABLE1 ORDER BY FIELD1)
UNION
(SELECT FIELD2 FROM TABLE2 ORDER BY FIELD2)
UNION
(SELECT FIELD3 FROM TABLE3 ORDER BY FIELD3) ORDER BY NEWFIELD

এটা চেষ্টা কর. এটা আমার জন্য কাজ করেছে।


0

SQL সার্ভার 2014/2012 / অন্যদের জন্য (চেক করা হয়নি):

SELECT * FROM 
(
  SELECT table1.field1 FROM table1 ORDER BY table1.field1
) 
as DUMMY_ALIAS1

UNION ALL

SELECT * FROM
( 
  SELECT table2.field1 FROM table2 ORDER BY table2.field1
) 
as DUMMY_ALIAS2

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