SQL CREATE TABLE ... AS SELECT
कथन आपको किसी क्वेरी के परिणामों को एक नई तालिका में सम्मिलित करने में सक्षम बनाता है।
मूल उदाहरण
नई तालिका में डेटा को चुनने और डालने का प्रदर्शन करने के लिए यहां एक बुनियादी उदाहरण दिया गया है।
CREATE TABLE Pets2 AS
(SELECT * FROM Pets);
यह Pets2
. नामक एक नई तालिका बनाता है (Pets
के समान परिभाषा के साथ ), और इसमें क्वेरी परिणाम सम्मिलित करता है।
SQL मानक को सबक्वेरी क्लॉज के चारों ओर कोष्ठक की आवश्यकता होती है, लेकिन वे आपके DBMS (उदाहरण के लिए PostgreSQL) में वैकल्पिक हो सकते हैं।
यदि हम दोनों तालिकाओं का चयन करते हैं, तो हम देख सकते हैं कि उन दोनों का डेटा समान है।
barney=# SELECT * FROM Pets;
petid | pettypeid | ownerid | petname | dob
-------+-----------+---------+---------+------------
1 | 2 | 3 | Fluffy | 2020-11-20
2 | 3 | 3 | Fetch | 2019-08-16
3 | 2 | 2 | Scratch | 2018-10-01
4 | 3 | 3 | Wag | 2020-03-15
5 | 1 | 1 | Tweet | 2020-11-28
6 | 3 | 4 | Fluffy | 2020-09-17
7 | 3 | 2 | Bark |
8 | 2 | 4 | Meow |
(8 rows)
barney=# SELECT * FROM Pets2;
petid | pettypeid | ownerid | petname | dob
-------+-----------+---------+---------+------------
1 | 2 | 3 | Fluffy | 2020-11-20
2 | 3 | 3 | Fetch | 2019-08-16
3 | 2 | 2 | Scratch | 2018-10-01
4 | 3 | 3 | Wag | 2020-03-15
5 | 1 | 1 | Tweet | 2020-11-28
6 | 3 | 4 | Fluffy | 2020-09-17
7 | 3 | 2 | Bark |
8 | 2 | 4 | Meow |
(8 rows)
जब टेबल पहले से मौजूद हो
अगर हम CREATE TABLE ... AS SELECT
. चलाने की कोशिश करते हैं बयान फिर से, हमें एक त्रुटि मिलती है, पहले से मौजूद तालिका के कारण।
CREATE TABLE Pets2 AS
(SELECT * FROM Pets);
परिणाम:
relation "pets2" already exists
यदि आप किसी तालिका में डेटा सम्मिलित करना चाहते हैं जो पहले से मौजूद है, तो INSERT INTO... SELECT
का उपयोग करें बयान। यह डेटा को किसी भी मौजूदा डेटा में जोड़ देगा। अर्थात्, यह किसी भी मौजूदा पंक्तियों को रखते हुए तालिका में नई पंक्तियाँ जोड़ देगा।
परिणाम फ़िल्टर करना
SELECT
स्टेटमेंट सामान्य SELECT
कर सकता है कथन सामग्री, जैसे परिणामों को WHERE
. से फ़िल्टर करना खंड।
CREATE TABLE Pets3 AS
(SELECT * FROM Pets
WHERE DOB < '2020-06-01');
इस उदाहरण में, मैं डेटा को केवल उन पालतू जानवरों के लिए फ़िल्टर करता हूं जिनकी जन्म तिथि (DOB) 1 जून, 2020 से पहले की है।
एकाधिक तालिकाओं से चयन करना
आप एकाधिक तालिकाओं से डेटा का चयन कर सकते हैं, फिर गंतव्य तालिका की परिभाषा परिणाम सेट पर आधारित हो सकती है।
CREATE TABLE PetsTypesOwners AS
(SELECT
p.PetId,
p.PetName,
p.DOB,
pt.PetTypeId,
pt.PetType,
o.OwnerId,
o.FirstName,
o.LastName,
o.Phone,
o.Email
FROM Pets p
INNER JOIN PetTypes pt
ON p.PetTypeId = pt.PetTypeId
INNER JOIN Owners o
ON p.OwnerId = o.OwnerId);
यहां, हम तीन तालिकाओं को क्वेरी करते हैं और परिणामों को PetsTypesOwners
नामक तालिका में सम्मिलित करते हैं ।
ध्यान दें कि मैंने प्रत्येक कॉलम को यहां सूचीबद्ध किया है क्योंकि मैं सभी कॉलम शामिल नहीं करना चाहता था।
विशेष रूप से, मैं विदेशी कुंजी/प्राथमिक कुंजी कॉलम पर डबल अप नहीं करना चाहता था। मेरे मामले में, विदेशी कुंजी मूल तालिका में उनके प्राथमिक कुंजी समकक्षों के समान नाम साझा करते हैं, और गंतव्य तालिका में डुप्लिकेट कॉलम नाम बनाए जाने के कारण मुझे एक त्रुटि मिली होगी।
यहाँ मेरा मतलब है।
CREATE TABLE PetsTypesOwners2 AS
(SELECT *
FROM Pets p
INNER JOIN PetTypes pt
ON p.PetTypeId = pt.PetTypeId
INNER JOIN Owners o
ON p.OwnerId = o.OwnerId);
परिणाम:
column "pettypeid" specified more than once
यदि आपकी विदेशी कुंजियाँ प्राथमिक कुंजियों के लिए अलग-अलग स्तंभ नामों का उपयोग करती हैं, तो संभवतः आपके पास एक गंतव्य तालिका होगी जिसमें अनावश्यक स्तंभ हैं (एक प्राथमिक कुंजी के लिए, एक विदेशी कुंजी के लिए, और प्रत्येक में समान मान हैं)।पी>
यदि आप वास्तव में ऐसे डुप्लिकेट कॉलम शामिल करना चाहते हैं, लेकिन उनका नाम समान है, तो आप उन्हें गंतव्य तालिका में किसी भिन्न नाम से निर्दिष्ट करने के लिए हमेशा उपनाम का उपयोग कर सकते हैं।
CREATE TABLE PetsTypesOwners2 AS
(SELECT
p.PetId,
p.OwnerId AS PetOwnerId,
p.PetTypeId AS PetPetTypeId,
p.PetName,
p.DOB,
pt.PetTypeId,
pt.PetType,
o.OwnerId,
o.FirstName,
o.LastName,
o.Phone,
o.Email
FROM Pets p
INNER JOIN PetTypes pt
ON p.PetTypeId = pt.PetTypeId
INNER JOIN Owners o
ON p.OwnerId = o.OwnerId);
इस मामले में मैंने दो कॉलम के नाम को PetOwnerId
पर फिर से असाइन करने के लिए कॉलम एलियासेस का इस्तेमाल किया। और PetPetTypeId
.
DBMS सपोर्ट
हालांकि CREATE TABLE ... AS SELECT
कथन SQL मानक के अनुरूप है, यह सभी DBMS द्वारा समर्थित नहीं है। साथ ही, जो लोग इसका समर्थन करते हैं, उनके लिए इसके कार्यान्वयन में भिन्नताएं हैं।
इसलिए, यदि आप इस कथन का उपयोग करना चाहते हैं, तो मेरा सुझाव है कि आप अपने DBMS के दस्तावेज़ों की जाँच करें।
यदि आप SQL सर्वर का उपयोग करते हैं, तो आप SELECT INTO
. का उपयोग कर सकते हैं बयान, जो मूल रूप से वही काम करता है।
इसमें INSERT INTO ... SELECT
. भी है बयान है कि कई डीबीएमएस समर्थन करते हैं। यह कथन क्वेरी परिणामों को मौजूदा तालिका में सम्मिलित करता है।