SQL SELECT INTO
स्टेटमेंट एक साइबेस एक्सटेंशन है जिसका उपयोग किसी क्वेरी के परिणामों को एक तालिका (या एक चर, डीबीएमएस के आधार पर) में सम्मिलित करने के लिए किया जा सकता है।
SQL सर्वर और PostgreSQL जैसे DBMS में, SELECT INTO
कथन एक नई तालिका बनाता है और उसमें क्वेरी से परिणामी पंक्तियों को सम्मिलित करता है।
मारियाडीबी में यह परिणाम को एक चर में सेट करता है। Oracle में, यह चयनित मानों को चर या संग्रह के लिए निर्दिष्ट करता है।
MySQL और SQLite SELECT INTO
का समर्थन नहीं करते हैं बिल्कुल बयान।
इस आलेख में दिए गए उदाहरण परिणाम सेट को तालिका में सम्मिलित करते हैं। MariaDB और Oracle में, गंतव्य तालिका को एक चर नाम से बदला जा सकता है (या यदि आप Oracle का उपयोग कर रहे हैं तो संग्रह नाम)।
मूल उदाहरण
नई तालिका में डेटा को चुनने और डालने का प्रदर्शन करने के लिए यहां एक बुनियादी उदाहरण दिया गया है।
SELECT * INTO Pets2
FROM Pets;
यह उदाहरण Pets2
. नामक एक तालिका बनाता है Pets
called नामक तालिका की समान परिभाषा के साथ और Pets
. से सभी डेटा सम्मिलित करता है Pets2
. में ।
हम दोनों तालिकाओं की सामग्री का चयन करके इसे सत्यापित कर सकते हैं।
SELECT * FROM Pets;
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 | NULL | | 8 | 2 | 4 | Meow | NULL | +---------+-------------+-----------+-----------+------------+ (8 rows affected) +---------+-------------+-----------+-----------+------------+ | 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 | NULL | | 8 | 2 | 4 | Meow | NULL | +---------+-------------+-----------+-----------+------------+ (8 rows affected)
जब टेबल पहले से मौजूद हो
अगर हम SELECT INTO
. को चलाने का प्रयास करते हैं बयान फिर से, हमें एक त्रुटि मिलती है, पहले से मौजूद तालिका के कारण।
SELECT * INTO Pets2
FROM Pets;
परिणाम:
Msg 2714, Level 16, State 6, Line 1 There is already an object named 'Pets2' in the database.
यदि आप किसी तालिका में डेटा सम्मिलित करना चाहते हैं जो पहले से मौजूद है, तो INSERT INTO... SELECT
का उपयोग करें बयान। यह डेटा को किसी भी मौजूदा डेटा में जोड़ देगा। अर्थात्, यह किसी भी मौजूदा पंक्तियों को रखते हुए तालिका में नई पंक्तियाँ जोड़ देगा
परिणाम फ़िल्टर करना
SELECT
स्टेटमेंट सामान्य SELECT
कर सकता है कथन सामग्री, जैसे परिणामों को WHERE
. से फ़िल्टर करना खंड।
SELECT * INTO Pets3
FROM Pets
WHERE DOB < '2020-06-01';
इस उदाहरण में, मैं डेटा को केवल उन पालतू जानवरों के लिए फ़िल्टर करता हूं जिनकी जन्म तिथि (DOB) 1 जून, 2020 से पहले की है।
एकाधिक तालिकाओं से चयन करना
आप एकाधिक तालिकाओं से डेटा का चयन कर सकते हैं, फिर गंतव्य तालिका की परिभाषा परिणाम सेट पर आधारित हो सकती है।
SELECT
p.PetId,
p.PetName,
p.DOB,
pt.PetTypeId,
pt.PetType,
o.OwnerId,
o.FirstName,
o.LastName,
o.Phone,
o.Email
INTO PetsTypesOwners
FROM Pets p
INNER JOIN PetTypes pt
ON p.PetTypeId = pt.PetTypeId
INNER JOIN Owners o
ON p.OwnerId = o.OwnerId;
यहां, हम तीन तालिकाओं को क्वेरी करते हैं और परिणामों को PetsTypesOwners
नामक तालिका में सम्मिलित करते हैं ।
ध्यान दें कि मैंने प्रत्येक कॉलम को यहां सूचीबद्ध किया है क्योंकि मैं सभी कॉलम शामिल नहीं करना चाहता था।
विशेष रूप से, मैं विदेशी कुंजी/प्राथमिक कुंजी कॉलम पर डबल अप नहीं करना चाहता था। मेरे मामले में, विदेशी कुंजी मूल तालिका में उनके प्राथमिक कुंजी समकक्षों के समान नाम साझा करते हैं, और गंतव्य तालिका में डुप्लिकेट कॉलम नाम बनाए जाने के कारण मुझे एक त्रुटि मिली होगी।
यहाँ मेरा मतलब है।
SELECT *
INTO PetsTypesOwners2
FROM Pets p
INNER JOIN PetTypes pt
ON p.PetTypeId = pt.PetTypeId
INNER JOIN Owners o
ON p.OwnerId = o.OwnerId;
परिणाम:
Msg 2705, Level 16, State 3, Line 1 Column names in each table must be unique. Column name 'PetTypeId' in table 'PetsTypesOwners2' is specified more than once.
यदि आपकी विदेशी कुंजियाँ प्राथमिक कुंजियों के लिए अलग-अलग स्तंभ नामों का उपयोग करती हैं, तो संभवतः आपके पास एक गंतव्य तालिका होगी जिसमें अनावश्यक स्तंभ हैं (एक प्राथमिक कुंजी के लिए, एक विदेशी कुंजी के लिए, और प्रत्येक में समान मान हैं)।पी>
यदि आप वास्तव में ऐसे डुप्लिकेट कॉलम शामिल करना चाहते हैं, लेकिन उनका नाम समान है, तो आप उन्हें गंतव्य तालिका में किसी भिन्न नाम से निर्दिष्ट करने के लिए हमेशा उपनाम का उपयोग कर सकते हैं।
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
INTO PetsTypesOwners3
FROM Pets p
INNER JOIN PetTypes pt
ON p.PetTypeId = pt.PetTypeId
INNER JOIN Owners o
ON p.OwnerId = o.OwnerId;
इस मामले में मैंने दो कॉलम के नाम को PetOwnerId
पर फिर से असाइन करने के लिए कॉलम एलियासेस का इस्तेमाल किया। और PetPetTypeId
.
दृश्य से चयन करें
यदि आवश्यक हो तो आप दृश्य से डेटा भी चुन सकते हैं।
SELECT * INTO PetTypeCount
FROM vPetTypeCount;
यह vPetTypeCount
. से डेटा का चयन करता है देखें और इसे PetTypeCount
. नामक एक नई तालिका में डालें ।
हम इसे SELECT
. से सत्यापित कर सकते हैं बयान।
SELECT * FROM vPetTypeCount;
SELECT * FROM PetTypeCount;
परिणाम:
+-----------+---------+ | PetType | Count | |-----------+---------| | Bird | 1 | | Cat | 3 | | Dog | 4 | +-----------+---------+ (3 rows affected) +-----------+---------+ | PetType | Count | |-----------+---------| | Bird | 1 | | Cat | 3 | | Dog | 4 | +-----------+---------+ (3 rows affected)
डीबीएमएस समर्थन
जैसा कि बताया गया है, SELECT INTO
स्टेटमेंट एक साइबेस एक्सटेंशन है, और यह सभी प्रमुख डीबीएमएस द्वारा समर्थित नहीं है। उदाहरण के लिए, MySQL और SQLite इसका समर्थन नहीं करते हैं।
इसके अलावा, डीबीएमएस में से जो इसका समर्थन करते हैं, वास्तविक कार्यान्वयन डीबीएमएस के बीच कुछ हद तक भिन्न होता है। उपरोक्त उदाहरण SQL सर्वर में किए गए थे। MariaDB और Oracle में आप गंतव्य तालिका को एक चर नाम (या Oracle में संग्रह नाम) से बदल सकते हैं।
यदि आपका DBMS SELECT INTO
. का समर्थन नहीं करता है कथन, संभावना है कि यह INSERT INTO... SELECT
. का समर्थन करता है बयान, इसलिए आपको इसके बजाय कोशिश करनी चाहिए।