আমাকে কেন দ্বৈত সারণী থেকে নির্বাচন করতে হবে?


15

এটি স্ট্যাকওভারফ্লো / ডিবিএ.স্ট্যাকেক্সচেঞ্জের সম্ভবত উপস্থিত বড় রিলেশন ডেটাবেস ম্যানেজমেন্ট সিস্টেমগুলিতে কাজ করে, এটি এসকিউএল সার্ভার, মাইএসকিউএল, পোস্টগ্রাইএসকিউএল এবং এসকিউএল (ওয়েবএসকিউএল) হয়

select 'abc' abc, 1 def;

এটি ওরাকলে কাজ করে না। কেন ওরাকলে আমাদের ডুয়াল থেকে নির্বাচন করা দরকার? এসকিউএল-এর আইএসও / এএনএসআই স্ট্যান্ডার্ডের কি নির্বাচনী বিবৃতিগুলির জন্য কোনও ফ্রোম ধারা প্রয়োজন ?


সম্পাদনা:

প্রতি Bacon Bitউত্তর, এটি এসকিউএল স্ট্যান্ডার্ড দ্বারা প্রয়োজনীয় বলে মনে হচ্ছে না।

সুতরাং বাস্তবে, কারণ ডুয়াল নামটি এমন একটি ভুল নাম, যদি আমি কোনও টেবিল তৈরি করে এটিটিএম বা এক নামকরণ করি, যেমন create table one (atom int);.. select 'abc' abc, 1 def FROM one;- এর সাথে তুলনা করে কোনও পারফরম্যান্স পেনাল্টি আছে কি SELECT .. FROM DUAL?


আমি মনে করি ডিবি 2 এ selectছাড়া একটিও করতে পারে না from। ডিবি 2 এর একই ধরণের ডামি টেবিল রয়েছে যার নাম SYSIBM.SYSDUMMY1 । এছাড়াও আপনি সম্ভবত এটি ইতিমধ্যে জানেন, কিন্তু আপনি যখন select 'A' from dual, dualটেবিলটি সত্যিই অ্যাক্সেস করা হয় না , যা আপনার সম্পাদনায় প্রশ্নের উত্তর দেয় (যা বিটিডব্লুতে একটি নতুন প্রশ্নের যোগ্যতা অর্জন করেছিল)।
জ্যাক বলছেন topanswers.xyz

1
এটি "সমস্ত" ডিবিএমএসে কাজ করে না । বেশ কয়েকটি ডিবিএমএস রয়েছে যেগুলি এফআরএম ব্যতীত কোনও নির্বাচনকে অনুমতি দেয় না। ম্যানুয়ালটি পারফরম্যান্স সম্পর্কে আপনার প্রশ্নের উত্তর দেয়: ডকস.অরাকল.com
সিডি

3
@ জ্যাকডুগলাস: আপনি সঠিক বলেছেন। ডিবি 2 এর জন্য একটি FROMধারা রয়েছে। আমার মাথার শীর্ষটি বন্ধ: ইনফর্মিক্স, ফায়ারবার্ড এবং অ্যাপাচি ডার্বিরও এটির প্রয়োজন।
a_horse_with_no_name

1
DB2 এর জন্য একটি FROM ধারা থাকা দরকার, তবে বিকল্পের মতো একটি বিবৃতি ব্যবহার করা উচিত values ('abc', 1)। আপনি অবশ্যই এই জাতীয় বিবৃতি থেকে নির্বাচন করতে পারেন:select abc from ( values ('abc',1) ) as t(abc,def)
লেনার্ট

উত্তর:


30

কঠোরভাবে, হ্যাঁ, FROMএকটি SELECTবিবৃতিটির ধারাটি alচ্ছিক নয়। এসকিউএল -৯৯ এর বাক্যSELECT গঠনটি বুনিয়াদি স্ট্যামমেন্টের বিবরণ দেয় এবং ক্লজটির FROMচারপাশে কোনও বর্গাকার বন্ধনী নেই। এটি নির্দেশ করে যে মানটি এটি অ-alচ্ছিক বিবেচনা করে:

SELECT [ DISTINCT | ALL ]
{Column expression [ AS name ]} [ ,... ] | *
FROM <Table reference> [ {,<Table reference>} ... ]
[ WHERE search condition ]
[ GROUP BY Columns [ HAVING condition ] ]
[ORDER BY {col_name | expr | position} [ASC | DESC],...]                                     
[LIMIT {[offset,] row_count | row_count OFFSET offset}]
[PROCEDURE procedure_name(argument_list)]
[INTO OUTFILE 'file_name' export_options |
 INTO DUMPFILE 'file_name' |
 INTO var_name [, var_name]]
[FOR UPDATE | LOCK IN SHARE MODE]

প্রকৃত ব্যবহারে, প্রোগ্রামারস এবং ডিবিএগুলি প্রায়শই টেবিলগুলিতে ডেটা ম্যানিপুলেট করা বা টেবিল এবং ডেটা স্ট্রাকচার হেরফের করা ব্যতীত অন্য কিছু করতে দরকারী বলে মনে হয়। এই ধরণের জিনিসটি মূলত এসকিউএল স্ট্যান্ডার্ডের আওতার বাইরে, যা নির্দিষ্ট বাস্তবায়নের বাদাম এবং বল্টের চেয়ে ডেটা বৈশিষ্ট্যগুলির সাথে সম্পর্কিত। আমরা চালাতে চাই SELECT getdate()বা SELECT 1বা SELECT DB_NAME()(বা আপনার উপভাষাগুলি যা পছন্দ) যাই হোক না কেন, আমরা আসলে কোনও টেবিল থেকে ডেটা চাই না।

ওরাকল নিম্নলিখিত কার্যকর সংজ্ঞা সহ একটি ডামি টেবিল ব্যবহার করে মান এবং বাস্তবায়নের স্বাতন্ত্র্য সমাধান করতে বেছে নিয়েছে:

CREATE TABLE DUAL (
  DUMMY CHAR(1)
  )

INSERT INTO DUAL (DUMMY) VALUES ('X')

অন্যান্য আরডিবিএমএসগুলি মূলত ধরে নেয় যে কোনও FROMনির্দিষ্ট না থাকলে একটি ডামি টেবিল ব্যবহৃত হয়।

দ্বৈত টেবিলের ইতিহাস উইকিপিডিয়া চালু আছে:

অভ্যন্তরীণ ভিউগুলিতে যোগদানের জন্য একটি টেবিল সরবরাহ করার জন্য অরাকল কর্পোরেশনের চার্লস ওয়েস দ্বারা ডুয়াল টেবিলটি তৈরি করা হয়েছিল:

আমি ওরাকল ডেটা অভিধানে অন্তর্নিহিত অবজেক্ট হিসাবে ডুয়াল টেবিলটি তৈরি করেছি। এটি কখনই নিজেকে দেখার কথা ছিল না, বরং এর পরিবর্তে এমন একটি দৃষ্টিভঙ্গির অভ্যন্তরে ব্যবহৃত হয়েছিল যা প্রত্যাশা করা হয়েছিল। ধারণাটি ছিল যে আপনি ডুয়াল টেবিলের সাথে একটি যোগ দিতে পারেন এবং আপনার টেবিলে প্রতি এক সারিতে ফলাফলের জন্য দুটি সারি তৈরি করতে পারেন। তারপরে, গ্রুপ দ্বারা ব্যবহার করে, ফলাফলের যোগটিকে সংক্ষিপ্ত করে ডেটা পরিমাণ এবং আইএনডিএক্স সীমা (গুলি) এর পরিমাণ সঞ্চয় করতে পারে show নাম, ডুয়াল, কেবল একটি থেকে একজোড়া সারি তৈরি করার প্রক্রিয়াটির জন্য উপযুক্ত বলে মনে হয়েছিল।

মূল ডুয়াল টেবিলটিতে এটিতে দুটি সারি ছিল (সুতরাং এটির নাম) তবে পরবর্তীকালে এটির কেবল একটি সারি ছিল।


3
+1 এবং dba.se. এ স্বাগতম ইতিহাসের আকর্ষণীয় বিটের সাথে এটি একটি দুর্দান্ত উত্তর — আমি আশা করি আপনাকে ঘিরে থাকা এবং আরও বেশি অবদান রাখার জন্য আপনাকে উত্সাহ দেওয়া যেতে পারে :)
জ্যাক বলেছেন টপান্সওয়ার্স.অক্সিজ

4
এক বিকাশকারী দ্বৈত মধ্যে আরও কয়েক সারি inোকানো যখন একবার আমার দ্বারা ঘন্টা অন্তহীন মজা ছিল। প্রচুর জিনিস ভেঙেছে :) অপরাধীকে সন্ধান করতে কিছুক্ষণ সময় নিল!
ফিলি

8

dualঅপ্টিমাইজারটি বোঝার সুবিধাটি dualহ'ল একটি বিশেষ এক সারি, একটি কলামের টেবিল ( varchar2ডেটা টাইপ সহ) - যখন আপনি এটি কোয়েরিতে ব্যবহার করেন, পরিকল্পনাটি বিকাশ করার সময় এটি এই জ্ঞানটি ব্যবহার করে।

কেন আমাদের dualওরাকল থেকে নির্বাচন করা দরকার ?

আপনি dualনিজের টেবিলগুলি থেকে বা এটি থেকেও নির্বাচন করতে পারেন, আপনি চাইলে করতে পারেন।

আমার জন্য, আমি অবিচল dualথাকি কারণ আমি জানি dual। আমি জানি এটির কমপক্ষে 1 এবং সর্বাধিক 1 সারি রয়েছে। আমি জানি যে অপ্টিমাইজারটি dualআমার জন্য সবচেয়ে কার্যকর জিনিসটি সম্পর্কে সমস্ত কিছু জানেন এবং এটি করেন। অপ্টিমাইজারটি বোঝে dualএকটি যাদু, বিশেষ 1 সারি টেবিল। এটি থামল select *কারণ সেখানে একটি সারি থাকতে হবে। সুতরাং এটি ঠিক এটি কাজ করে।


"আমি জানি এটির কমপক্ষে 1 এবং সর্বাধিক 1 সারি রয়েছে" " ঠিক আছে, ডিবিএ সুবিধাসমূহ সহ একটি জার্ক (বা একটি নির্বোধ) পরিবর্তন করতে পারেDUAL । সতর্ক হোন!
নিক চাম্মাস

ভাল যদি আপনার সাথে ঘটে। এই ব্যক্তির কাছ থেকে সেশন তৈরি করুন ব্যতীত সমস্ত সুযোগ-সুবিধা বাতিল করুন। এবং যদি দ্বৈত কেউ দুর্ঘটনাক্রমে বাদ পড়ে?
দেবযুদ্ধ

আপনি টেবিল দ্বৈত (ডামি ভার্চার 2 (1)) স্টোরেজ (প্রাথমিক 1) বা ফ্ল্যাশব্যাক টেবিলটি ড্রপের আগে ডুয়াল ব্যবহার করে এটি তৈরি করতে পারেন
দেবযুদ্ধ

ঠিক আছে, অন্য যে কোনও বিদ্যমান সারণী থেকে অভিব্যক্তি নির্বাচন করার তুলনায় ডুয়াল ব্যবহারে এটি একটি সুবিধা, তবে পোস্টগ্র্রেএসকিউএল বা এসকিউএল সার্ভারের মতো ড্রুয়াল না থাকার বিকল্প হিসাবে ডুয়াল থাকার কী কী সুবিধা তা ব্যাখ্যা করে না
ডানুবিয়ান নাবিক

অরাকলে @ লুকাস লেচ # এমএসএসকিউএল সার্ভারের জন্য এফআরএম ছাড়া কোনও নির্বাচন নেই: এসকিউএল সার্ভারে ডুয়াল টেবিলের কোনও প্রয়োজন নেই। তবে আপনি যদি নিজের কোডটি ওরাকল থেকে এসকিউএল সার্ভারে স্থানান্তর করেন তবে আপনি এই স্ক্রিপ্টটি ব্যবহার করে দ্বৈত তৈরি করতে পারেন টেবিল ডুয়াল তৈরি করুন (ডামি ভ্যাচারার (1)) ডুয়াল (ডামি) ভ্যালুতে প্রবেশ করুন ('এক্স') যান তবে, আমি কোনও দেখতে পাচ্ছি না SQL সার্ভারে দ্বৈত সারণী ব্যবহার / তৈরি করার কারণ। এবং
এমএসএসকিউএল

1

অন্য দুটি উত্তর আমার উত্তরের জন্য ভাল পটভূমি সরবরাহ করে।

ওরাকল ডাটাবেসে এটি প্রচলিত এবং নির্ভরযোগ্য। এটি অন্য ডাটাবেসে ব্যর্থ হবে যাগুলির কোনও DUALটেবিল নেই। এটি ব্যবহার করার প্রয়োজন নেইDUAL , তবে আমি আপনাকে সুপারিশ করব।

স্ট্যান্ডার্ডস কমপ্লায়েন্ট ডাটাবেসগুলির জন্য একটি FROMধারা থাকতে হবে যা কমপক্ষে সারণির রেফারেন্স উল্লেখ করে। আপনার যদি একটি অর্ডার সারণী থাকে তবে FROM DUALক্লজের জন্য নিম্নলিখিত প্রতিস্থাপনটি কাজ করবে:

FROM   orders
WHERE  rownum =1

যে কোনও সারণী বা বিকল্পটি আপনি বেছে নিতে পারেন এবং এটি কার্যকর হবে Sub একটি সারণী প্রতিস্থাপন করুন বা দেখুন যা আপনি নির্বাচন করতে পারবেন না এবং এটি ব্যর্থ হবে। DUALকোনও ডিবিএ এটি ভাঙার ব্যপার হিসাবে আরও নির্ভরযোগ্য, সমস্ত ব্যবহারকারী এটি থেকে নির্বাচন করতে পারেন, এবং ফলাফল সেটে কেবল একটি সারি পাবেন। (এটি মাঝে মাঝে ভেঙে যায়))

টেবিলের রেফারেন্সটি অন্তর্ভুক্ত না করে ডেটা অ্যাক্সেসের জন্য মানদণ্ডের অনুবর্তী ক্রিয়া সম্পর্কে আমি অসচেতন which আমি এই জাতীয় ডেটা অল্প অ্যাক্সেস করি না কেন তা প্রদত্ত, আমি এরকম প্রয়োজন দেখছি না। আমি যে কেসগুলিতে চালিত হই সেগুলির অনেকগুলিই বিভিন্ন উপায়ে আরও ভালভাবে পরিচালনা করা যায়।


2
SELECT CURRENT_TIMESTAMP FROM (VALUES(1)) V(C)আমি বিশ্বাস করি এবং এটি কোনও নির্দিষ্ট টেবিলে নির্ভর করে না standard
মার্টিন স্মিথ

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