ওরাকল ডুয়াল টেবিলটি কীভাবে কাজ করবে?


32
SQL> desc dual
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 DUMMY                                              VARCHAR2(1)

SQL> select 4*5 from dual;

       4*5
----------
        20

SQL>

আমি এটা সত্যিই অদ্ভুত মনে। দ্বৈতে 4 * 5 নামে কোনও কলাম না থাকলে নির্বাচিত বিবৃতিটি কীভাবে কাজ করবে?

এছাড়াও, আমি যখন আমার নিজস্ব দ্বৈত সারণী তৈরি করি তখন কেন আমি একই আচরণ দেখতে পাই না?

SQL> create table dual2(dummy varchar2(1)); 

Table created.

SQL> desc dual2
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 DUMMY                                              VARCHAR2(1)

SQL> select 4*5 from dual2;

no rows selected

SQL> 

উত্তর:


29

উইকিপিডিয়া থেকে :

ডুয়াল টেবিলটি একটি বিশেষ এক-সারি টেবিল যা সমস্ত ওরাকল ডাটাবেস ইনস্টলেশনে ডিফল্টরূপে উপস্থিত থাকে। এটি সিডসেট বা ব্যবহারকারী হিসাবে সিউডোকলম নির্বাচন করার জন্য উপযুক্ত। সারণীতে DUMMY নামে একটি একক VARCHAR2 (1) কলাম রয়েছে যার মান 'এক্স'।

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

এটি উত্পাদনে ব্যবহার করা উচিত নয়, যদি না আপনি বিশেষত এসকিউএল এর মাধ্যমে নির্দিষ্ট পদ্ধতি গ্রহণের প্রয়োজন হয়।

4*5 একটি গাণিতিক অপারেশন, ঠিক যেমন 'Foo' একটি স্ট্রিং। সুতরাং, যে কোনও টেবিল থেকে 4 * 5 নির্বাচন করতে পারে, যেমন কোনও যেকোন টেবিল থেকে 'ফু' নির্বাচন করতে পারে, ডুয়াল একটি পরিচিত-ভাল টেবিল থেকে এটি নির্বাচন করার একটি উপায় যা এর একাধিক ফলাফল কখনও পায় না।

ডকুমেন্টেশন থেকে (কনসপটস):

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

ডুয়াল টেবিলটিতে DUMMY নামে একটি কলাম এবং মানটি X সহ একটি সারি রয়েছে has

এবং এসকিউএল রেফারেন্স :

ডুয়াল হল একটি টেবিল যা স্বয়ংক্রিয়ভাবে ওরাকল ডেটাবেস ডেটা অভিধানের সাথে তৈরি করা হয়। DUAL ব্যবহারকারী SYS এর স্কিমাতে রয়েছে তবে DUAL নামে সমস্ত ব্যবহারকারীর কাছে অ্যাক্সেসযোগ্য। এটির একটি কলাম রয়েছে, ডামি, যা VARCHAR2 (1) হিসাবে সংজ্ঞায়িত করা হয়েছে এবং এতে একটি মান X সহ একটি সারি রয়েছে D DUAL এর কেবল একটি সারি থাকায় ধ্রুবকটি কেবল একবারে ফিরে আসে। বিকল্পভাবে, আপনি যে কোনও টেবিল থেকে একটি ধ্রুবক, সিউডোকলোনম বা ভাবটি নির্বাচন করতে পারেন, তবে সারণীতে সারি থাকাকালীন মানটি যতবার ফিরে আসবে। ডুয়াল থেকে ধ্রুবক মান নির্বাচন করার অনেক উদাহরণের জন্য "এসকিউএল ফাংশন সম্পর্কে" দেখুন।

ওরাকল ডেটাবেস 10 জি রিলিজ 1 দিয়ে শুরু করে, লজিক্যাল I / O DUAL টেবিলটিতে সঞ্চালিত হয় না যখন একটি অভিব্যক্তি DUMMY কলামটি অন্তর্ভুক্ত করে না। এই অপ্টিমাইজেশানটি কার্যকর পরিকল্পনায় দ্রুত ডুয়াল হিসাবে তালিকাভুক্ত করা হয়। আপনি যদি ডুয়াল থেকে ডামি কলামটি নির্বাচন করেন, তবে এই অপটিমাইজেশনটি ঘটে না এবং যৌক্তিক আই / ও ঘটে।


5
"এটি উত্পাদনে ব্যবহার করা উচিত নয়, যদি না আপনি বিশেষত এসকিউএল এর মাধ্যমে নির্দিষ্ট পদ্ধতি প্রয়োগের প্রয়োজন হয়" কেন না?
নিক পিয়রপয়েন্ট

2
আমি এটিতেও প্রস্তুত হতে পারি না যে এটির উত্পাদনতে ব্যবহার করা উচিত নয়। আমার কাছে এটি "রোস্টের শেষগুলি কেটে ফেলার" মতো শোনাচ্ছে।
এরিক

1
নিজের সাথে একমত না হওয়ায় এই উত্তরটির উন্নতির প্রয়োজন। এক জায়গায় এটি সরকারী দস্তাবেজ থেকে অনুলিপি করেছে: "দ্বৈত সারণি দরকারী " এবং অন্য একটি জায়গায় এটি সুপারিশ করেছে "এটি উত্পাদনে ব্যবহার করা উচিত নয় , যদি না ..."
ypercubeᵀᴹ

18

DUAL নীচের এসকিউএল বিবৃতিটি যেমন দেখায় তেমন একটি সারণি হ'ল:

SELECT * FROM dual;

আপনার dual2টেবিলের কোনও সারি নেই। আপনি যদি একটি sertোকান, আপনি একই আচরণ দেখতে পাবেন।

4 * 5 একটি অভিব্যক্তি যা ওরাকল টেবিল থেকে ডেটা ব্যবহার না করেই মূল্যায়ন করতে পারে। এটি প্রতিটি সারির জন্য একবার মূল্যায়ন করবে, যেমন এটি সাধারণ কলামের এক্সপ্রেশন দিয়ে থাকে। সুতরাং যদি কোনও সারি না থাকে, কোনও ফল ফিরে আসবে না, যদি দুটি সারি থাকে তবে আপনি 20 বার পেয়ে যাবেন।


14

dualসারণী "কাজ করে" প্রায় ঠিক ভাবে অন্য কোন টেবিল কাজ করে: এটা একটা টেবিল যেখান থেকে আপনি রেকর্ড নির্বাচন করতে পারেন।

এর অর্থ, উদাহরণস্বরূপ, আপনি টেবিলটি বর্ণনা করতে পারেন। এখানে, এতে SQL*Plus:

SQL> set lines 50
SQL> desc dual
Name                    Null?    Typ
----------------------- -------- ----------------
DUMMY                            VARCHAR2(1)

সুতরাং, টেবিলের একটি কলাম রয়েছে, যার নাম dummyএকটি varchar2(1)

টেবিলটিতে নকশা অনুসারে একটি করে রেকর্ড রয়েছে (কমপক্ষে কেউ এটি দিয়ে বিভক্ত না হলে):

SQL> select count(*) from dual;

COUNT(*)
----------
         1

সুতরাং, অর্ডার দিয়ে একই আচরণ পেতে dual2আপনার সাথে আছে dual, আপনি দ্বৈত মধ্যে এক রেকর্ড যুক্ত করতে হবে। আরও ভাল, এটি একটি create table as select(সিটিএস) দিয়ে তৈরি করুন :

SQL> create table dual2 as select * from dual;

এখন, আপনার ক্যোয়ারী কাজ করে:

SQL> select 4*5 from dual2;
       4*5
----------
        20

এর আগে, আমি বলেছিলাম যে দ্বৈত প্রায় কোনও অন্য টেবিলের মতো কাজ করে। সুতরাং, কখন এটি অন্য কোনও টেবিলের মতো কাজ করে না?

এটি আলাদাভাবে আচরণ করে, যদি টেবিল থেকে কোনও মান নির্বাচিত না হয়। আবার, আপনার প্রশ্নের সাথে, আমি ওরাকলকে সেগুলি ব্যাখ্যা করতে দিয়েছি ...

SQL> set lines 150
SQL> explain plan for select 4*5 from dual2;

EXPLAIN PLAN ausgef³hrt.

... টেবিলটি কীভাবে অ্যাক্সেস করা হয় তা দেখতে:

SQL> select * from table(dbms_xplan.display);

PLAN_TABLE_OUTPUT
---------------------------------------------------------------------------
Plan hash value: 3445655939

-------------------------------------------------------------------
| Id  | Operation         | Name  | Rows  | Cost (%CPU)| Time     |
-------------------------------------------------------------------
|   0 | SELECT STATEMENT  |       |     1 |     3   (0)| 00:00:01 |
|   1 |  TABLE ACCESS FULL| DUAL2 |     1 |     3   (0)| 00:00:01 |
-------------------------------------------------------------------

এটি দেখা যায় যে বিবৃতিটি একটি কাজ full table accessকরে dual2

এখন, একই জিনিস dual:

SQL> explain plan for select 4*5 from dual;

EXPLAIN PLAN ausgef³hrt.

SQL> select * from table(dbms_xplan.display);

PLAN_TABLE_OUTPUT
-------------------------------------------------------------------
Plan hash value: 1388734953

-----------------------------------------------------------------
| Id  | Operation        | Name | Rows  | Cost (%CPU)| Time     |
-----------------------------------------------------------------
|   0 | SELECT STATEMENT |      |     1 |     2   (0)| 00:00:01 |
|   1 |  FAST DUAL       |      |     1 |     2   (0)| 00:00:01 |
-----------------------------------------------------------------

এখানে dualটেবিলটি আলাদাভাবে আচরণ করে: এর মান dummyপ্রয়োজন হয় না, সুতরাং fast dualডিস্কের প্রকৃত মানটি না পড়ার জন্য একটি ক্রিয়াকলাপ চালানো হয়।


10

ঘটনাক্রমে, ডুয়াল হ'ল কয়েকটি 'টেবিলগুলির মধ্যে একটি যা কাজ শুরু হয় যখন উদাহরণস্বরূপ শুরু হয়েছিল কিন্তু ডাটাবেস খোলা হয়নি।

আপনি কিছু পেতে

ADDR     INDX   INST_ID D
-------- ------ ------- -
0C0362D4      0       1 X

9

অন্যান্য উত্তরের পাশাপাশি, স্পেস এসকিউএল পাঠ্য (কমপক্ষে কিছু জায়গায়) সম্পর্কে ওরাকল এতটা পছন্দসই নয়। এসকিউএল পার্সার কিছু ক্ষেত্রে অক্ষর শ্রেণীর পার্থক্য দ্বারা টোকনাইজ করে, কেবল শ্বেতস্থান দ্বারা নয়।

উদাহরণস্বরূপ, আপনি এই জাতীয় বিবৃতি চালাতে পারেন:

এসকিউএল> দ্বৈত থেকে * নির্বাচন করুন;

ডি
-
এক্স


এসকিউএল> দ্বৈত থেকে (1) নির্বাচন করুন;

       (1)
----------
         1

এসকিউএল> দ্বৈত থেকে নির্বাচন-নাল নির্বাচন করুন;

     -শূন্য
----------


এসকিউএল> দ্বৈত থেকে নির্বাচন -১;

        -1
----------
        -1

এসকিউএল> 

এতে কোনও সাদা জায়গা ছাড়াই এসকিউএল চালানো সম্ভব:

এসকিউএল> / ** / দ্বৈত থেকে * নির্বাচন করুন;

ডি
-
এক্স

আমার এখানে আরও কয়েকটি উদাহরণ রয়েছে:

http://blog.tanelpoder.com/2008/01/14/can-you-write-a-working-sql-statement-without-using-any-whitespace/

তানেল পোদার


2
অনেকগুলি জায়গা বাদ দেওয়ার এই ক্ষমতাটি ওরাকলটির কাছে অনন্য নয়। এসকিউএল সার্ভারে একই কাজ করে।
এরিক

8

একটি দ্রুত দ্বৈত ক্রিয়া আপনার কোডটি x code দ্বৈত জিজ্ঞাসা করতে পুনরায় লিখে writes এই "টেবিল "টি এসজিএ-তে একটি সি ডেটা কাঠামো, আপনি এটি নামমাত্র মোডে জিজ্ঞাসা করতে পারেন।


4

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

select 3+5 ;

ওরাকল পারে না। একটি ওরাকল নির্বাচন বিবৃতি সর্বদা একটি "থেকে"-ক্লাউজ প্রয়োজন।

কিছু ফাংশন DUMP এর মতো pl / sql প্রকাশে ব্যবহার করা যায় না ।

সুতরাং

declare
str varchar2(100);
begin
str:=dump('Hallo');
end;
/

একটি ব্যতিক্রম উত্থাপন করবে কিন্তু

declare
str varchar2(100);
begin
select dump('Hallo') into str from dual;
end;
/

কাজ করবে.

এটি একটি ক্যোয়ারির ফলাফল সেট প্রসারিত করতে ব্যবহৃত হতে পারে

select user_id,username from user_users
union all
select -1,'NO USER'
from dual
/

যা দিয়েছে

| USER_ID |     USERNAME |
|---------|--------------|
|  476267 | USER_4_E8C50 |
|      -1 |      NO USER |

অথবা নির্বাচিত প্রশ্নগুলির সাহায্যে ডেটা তৈরি করুন CONNECT BY:

select level as n 
from dual
connect by level <= 5 ;

বা একটি পুনরাবৃত্তি সিটিই:

with nlist(n) as (
  select 1 from dual
  union all
  select n+1
  from nlist 
  where n<5    )
select n
from nlist
 ;

যা ফিরে আসে

| N |
|---|
| 1 |
| 2 |
| 3 |
| 4 |
| 5 |

মধ্যে sqlfiddle


3

এর মূল্য কী, এটি মাইএসকিউএলে ঠিক একইভাবে কাজ করে।

mysql> use test;
Database changed

mysql> create table fred(billy int);
Query OK, 0 rows affected (0.79 sec)

mysql> select 4 + 5 from fred;
Empty set (0.00 sec)

mysql> select 4 + 5 as mary from fred;
Empty set (0.00 sec)

mysql> insert into fred values(1);
Query OK, 1 row affected (0.13 sec)

mysql> select 4 + 5 from fred;
+-------+
| 4 + 5 |
+-------+
|     9 |
+-------+
1 row in set (0.00 sec)

mysql> select 4 + 5 as mary from fred;
+------+
| mary |
+------+
|    9 |
+------+
1 row in set (0.00 sec)

mysql> insert into fred values(2);
Query OK, 1 row affected (0.08 sec)

mysql> select 4 + 5 from fred;
+-------+
| 4 + 5 |
+-------+
|     9 |
|     9 |
+-------+
2 rows in set (0.00 sec)

mysql> select 4 + 5 as mary from fred;
+------+
| mary |
+------+
|    9 |
|    9 |
+------+
2 rows in set (0.00 sec)

mysql> explain select 4 + 5 as mary from fred;
+----+-------------+-------+------+---------------+------+---------+------+------+-------+
| id | select_type | table | type | possible_keys | key  | key_len | ref  | rows | Extra |
+----+-------------+-------+------+---------------+------+---------+------+------+-------+
|  1 | SIMPLE      | fred  | ALL  | NULL          | NULL | NULL    | NULL |    2 | NULL  |
+----+-------------+-------+------+---------------+------+---------+------+------+-------+
1 row in set (0.00 sec)

mysql> 

এবং এটি আরও উপস্থিত হয় যে ডুয়াল মাইএসকিউএল মধ্যে মেমরি কাঠামোর এক ধরণের হয়। দুটি ব্যাখ্যা করার পরিকল্পনার মধ্যে পার্থক্যটি নোট করুন - মাইএসকিউএল-এ ডুয়াল জন্য "কোনও টেবিল ব্যবহার করা হয়নি"।

মজার বিষয় যদিও, আমি মাইএসকিউএল এর দ্বৈত উপর একটি DESC করতে পারবেন না, যা ওরাকল থেকে পৃথক - তবে ওরাকল সিনট্যাক্সটি মাইএসকিউএলে কাজ করার অনুমতি দেওয়ার জন্য এটি বিশেষভাবে AIUI প্রবর্তিত হয়েছিল।

mysql> select 4 + 5 from dual;
+-------+
| 4 + 5 |
+-------+
|     9 |
+-------+
1 row in set (0.00 sec)

mysql> explain select 4 + 5 from dual;
+----+-------------+-------+------+---------------+------+---------+------+------+----------------+
| id | select_type | table | type | possible_keys | key  | key_len | ref  | rows | Extra          |
+----+-------------+-------+------+---------------+------+---------+------+------+----------------+
|  1 | SIMPLE      | NULL  | NULL | NULL          | NULL | NULL    | NULL | NULL | No tables used |
+----+-------------+-------+------+---------------+------+---------+------+------+----------------+
1 row in set (0.00 sec)

mysql> desc dual;
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'dual' at line 1
mysql> 

2

ওরাকল ডাটাবেসে ডুয়াল টেবিলটি মূলত সিউডো-কলামগুলির মান পেতে ব্যবহৃত হয়। এটিতে নিম্নলিখিত বৈশিষ্ট্য রয়েছে:

  1. এটি sys ব্যবহারকারী দ্বারা মালিকানাধীন
  2. এটি সমস্ত ব্যবহারকারীর জন্য উপলব্ধ
  3. এটিতে কেবলমাত্র একটি কলাম রয়েছে যার নাম ডেটাইটিপ ভার্চার 2 (1) এর সাথে ডামি রয়েছে, এই কলামটিতে একটি অক্ষরের সর্বাধিক প্রস্থ থাকতে পারে।

আপনি যদি আরও বিশদ পেতে চান তবে এখানে চেক করুন

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