sql - एसक्यूएल तालिका*से SELECT*[कॉलम ए को छोड़कर] का उपयोग कर कॉलम को बाहर कर देता है?




sql-server tsql (20)

क्या सभी स्तंभों को निर्दिष्ट किए बिना तालिका से स्तंभ (ओं) को बाहर करने का कोई तरीका है?

घोषणात्मक एसक्यूएल का सामान्य तरीके से उपयोग करना, नहीं।

मुझे लगता है कि आपका प्रस्तावित वाक्यविन्यास योग्य और अच्छा है। असल में, रिलेशनल डेटाबेस भाषा 'ट्यूटोरियल डी' में एक बहुत ही समान वाक्यविन्यास होता है जहां ALL BUT कीवर्ड का उपयोग गुणों (कॉलम) के सेट के बाद किया जाता है।

हालांकि, एसक्यूएल का SELECT * पहले से ही बहुत फ्लाक हो जाता है (@ गुफा का जवाब यहां एक सामान्य आपत्ति है), इसलिए मुझे नहीं लगता कि SELECT ALL BUT जल्द ही SQL मानक में आ जाएंगे।

मुझे लगता है कि सबसे अच्छा 'चारों ओर काम करना' केवल उन्हीं स्तंभों के साथ एक VIEW बनाना है, जो उस VIEW SELECT * FROM ThatView

हम सभी जानते हैं कि किसी तालिका से सभी कॉलम चुनने के लिए, हम इसका उपयोग कर सकते हैं

SELECT * FROM tableA

क्या सभी स्तंभों को निर्दिष्ट किए बिना तालिका से स्तंभ (ओं) को बाहर करने का कोई तरीका है?

SELECT * [except columnA] FROM tableA

मुझे पता है कि एकमात्र तरीका मैन्युअल रूप से सभी कॉलम निर्दिष्ट करना है और अवांछित कॉलम को बाहर करना है। यह वास्तव में समय लेने वाला है इसलिए मैं इस पर समय और प्रयास बचाने के तरीकों की तलाश कर रहा हूं, साथ ही भावी रखरखाव में तालिका में कम / कम कॉलम होना चाहिए।

धन्यवाद!


अपनी तालिका के आकार के आधार पर, आप इसे Excel में निर्यात कर सकते हैं और इसे एक नई तालिका के लिए स्थानांतरित कर सकते हैं जिसमें मूल तालिका के कॉलम नई तालिका में पंक्तियां होंगी। फिर इसे अपने SQL डेटाबेस में वापस ले जाएं और पंक्ति के अनुसार पंक्तियों का चयन करें और उन्हें एक और नई तालिका में डालें। अंत में Excel में इस नई तालिका को निर्यात करें और अपनी वांछित तालिका रखने के लिए एक और स्थानांतरित करें और इसे अपने SQL डेटाबेस पर वापस ले जाएं।

सुनिश्चित नहीं है कि SQL डेटाबेस के भीतर ट्रांज़ेप किया जा सकता है, यदि हां तो यह और भी आसान होगा।

जेफ


आप devart.com से एसक्यूएल पूर्ण प्राप्त कर सकते हैं, जो सिर्फ लाल गेट (जैसा कि कैरेंज के उत्तर में वर्णित है) से एसक्यूएल प्रॉम्प्ट की तरह * वाइल्डकार्ड का विस्तार नहीं करता है, बल्कि चेकबॉक्स के साथ कॉलम पिकर ड्रॉप डाउन भी प्रदान करता है जिसमें आप सभी को देख सकते हैं कॉलम जिन्हें आप चुनिंदा सूची में चाहते हैं और वे आपके लिए स्वचालित रूप से डाले जाएंगे (और यदि आप एक कॉलम अनचेक करते हैं तो इसे स्वचालित रूप से चयन सूची से निकाल दिया जाएगा)।


आप एक ऐसा दृश्य बना सकते हैं जिसमें कॉलम आप चुनना चाहते हैं, तो आप दृश्य से * चुन सकते हैं ...


एक सहयोगी ने एक अच्छा विकल्प सलाह दी:

  • अपनी पिछली क्वेरी (जहां आप डेटा उत्पन्न करते हैं या प्राप्त करते हैं) में एक तालिका में चुनें (जिसे आप पूरा करते समय हटा देंगे)। यह आपके लिए संरचना तैयार करेगा।
  • नई क्वेरी विंडो बनाने के रूप में एक स्क्रिप्ट करें।
  • अवांछित कॉलम निकालें। शेष कॉलम को 1 लाइनर में प्रारूपित करें और अपनी कॉलम सूची के रूप में पेस्ट करें।
  • आपके द्वारा बनाई गई तालिका हटाएं।

किया हुआ...

इससे हमें बहुत मदद मिली।


एसएसएमएस में इंटेलिसेन्स और एलिसिंग के साथ एक आसान तरीका है। इसे इस्तेमाल करे

  1. टेक्स्ट एडिटर में राइट-क्लिक करें और सुनिश्चित करें कि इंटेलिसेन्स सक्षम है।
  2. उपनाम के साथ क्वेरी टाइप करें [चयन टी। * Tablename टी से]।
  3. टेक्स्ट टी पर जाएं । * और * को हटाएं, और एसएसएमएस एफ एलियाज्ड टेबल के कॉलम को स्वत: सूचीबद्ध करेगा।
फिर आप केवल उन कॉलम को निर्दिष्ट कर सकते हैं जिन्हें आप चाहते हैं कि एसएसएमएस का उपयोग किसी अन्य स्क्रिप्ट को चुनने के लिए करें और फिर अधिक प्रतिलिपि / पेस्ट ऑपरेशन करें। यह मेरे लिए हर समय उपयोगी है।


एसक्यूएल प्रबंधन स्टूडियो में आप ऑब्जेक्ट एक्सप्लोरर में कॉलम का विस्तार कर सकते हैं, फिर स्तंभों की कॉमा से अलग सूची प्राप्त करने के लिए Columns ट्री आइटम को क्वेरी विंडो में खींचें।


ऐसा करने का कोई तरीका नहीं है। हो सकता है कि आप कस्टम स्थिति बना सकें यदि यह आपकी स्थिति में व्यवहार्य है

संपादित करें यदि आपका डीबी गतिशील एसक्यूएल के निष्पादन का समर्थन करता है तो आप एक एसपी लिख सकते हैं और उन कॉलम को पास कर सकते हैं जिन्हें आप देखना नहीं चाहते हैं और इसे गतिशील रूप से क्वेरी बनाने दें और परिणाम आपको वापस कर दें। मुझे लगता है कि यह SQL सर्वर में कम से कम करने योग्य है


ऑब्जेक्ट एक्सप्लोरर में राइट क्लिक टेबल, शीर्ष 1000 पंक्तियों का चयन करें

यह सभी कॉलम सूचीबद्ध करेगा और नहीं *। फिर अवांछित कॉलम हटाएं। इसे स्वयं टाइप करने से बहुत तेज़ होना चाहिए।

फिर जब आपको लगता है कि यह थोड़ा अधिक काम है, तो लाल गेट का एसक्यूएल प्रॉम्प्ट प्राप्त करें, और टीबीएल से एसएसएफ टाइप करें, * पर जाएं और फिर टैब पर क्लिक करें।


कभी-कभी एक ही प्रोग्राम को विभिन्न डेटाबेस स्टैक्चर को संभालना चाहिए। तो मैं select वक्तव्य में त्रुटियों से बचने के लिए प्रोग्राम में कॉलम सूची का उपयोग नहीं कर सका।

* मुझे सभी वैकल्पिक फ़ील्ड देता है। मैं जांच करता हूं कि उपयोग से पहले डेटा तालिका में फ़ील्ड मौजूद हैं या नहीं। select में * का उपयोग करने के लिए यह मेरा कारण है।

इस प्रकार मैं बहिष्कृत फ़ील्ड को संभालता हूं:

Dim da As New SqlDataAdapter("select * from table", cn)
da.FillSchema(dt, SchemaType.Source)
Dim fieldlist As String = ""
For Each DC As DataColumn In DT.Columns
   If DC.ColumnName.ToLower <> excludefield Then
    fieldlist = fieldlist &  DC.Columnname & ","
   End If
  Next

दूसरों की तरह कहा है कि ऐसा करने का कोई तरीका नहीं है, लेकिन यदि आप एसक्यूएल सर्वर का उपयोग कर रहे हैं तो एक चाल जो मैं उपयोग करता हूं वह है आउटपुट को अल्पविराम से अलग करने के लिए, फिर करें

select top 1 * from table

और आउटपुट विंडो से कॉलम की पूरी सूची में कटौती। फिर आप चुन सकते हैं कि आप उन्हें किस प्रकार के कॉलम के बिना चाहते हैं।


नहीं, ऐसा करने का कोई तरीका नहीं है, और ऐसा करने का कोई अच्छा कारण नहीं है।

डेटा चुनते समय आपको कभी भी * उपयोग नहीं करना चाहिए, आपको हमेशा उन फ़ील्ड को निर्दिष्ट करना चाहिए जिन्हें आप चाहते हैं। कारण यह है कि आप क्वेरी को वही काम करना चाहते हैं, भले ही आप बाद में तालिका में एक और फ़ील्ड जोड़ दें। इसके अलावा आप परिणामों में फ़ील्ड का क्रम निर्दिष्ट करते हैं ताकि तालिका में फ़ील्ड को पुनर्व्यवस्थित करने से नतीजा न हो।

वही लागू होगा * except कि अगर ऐसा करना संभव था।


मुझे इस डेटाबेस का समर्थन करने वाले किसी भी डेटाबेस के बारे में पता नहीं है (SQL सर्वर, MySQL, Oracle, PostgreSQL)। यह निश्चित रूप से एसक्यूएल मानकों का हिस्सा नहीं है, इसलिए मुझे लगता है कि आपको केवल उन्हीं कॉलम निर्दिष्ट करना होगा जिन्हें आप चाहते हैं।

आप निश्चित रूप से अपने SQL कथन को गतिशील रूप से बना सकते हैं और सर्वर को निष्पादित कर सकते हैं। लेकिन यह एसक्यूएल इंजेक्शन के लिए संभावना खुलता है ..


मुझे पता है कि यह थोड़ा पुराना है, लेकिन मैं सिर्फ एक ही मुद्दे में भाग गया था और एक जवाब की तलाश में था। तब मेरे पास एक वरिष्ठ डेवलपर था जो मुझे एक बहुत ही सरल चाल दिखाता था।

यदि आप प्रबंधन स्टूडियो क्वेरी संपादक का उपयोग कर रहे हैं, तो डेटाबेस का विस्तार करें, फिर उस तालिका का विस्तार करें जिसे आप चुन रहे हैं ताकि आप कॉलम फ़ोल्डर देख सकें।

अपने चयन कथन में, उपर्युक्त संदर्भित कॉलम फ़ोल्डर को हाइलाइट करें और इसे क्वेरी विंडो में खींचें और छोड़ दें। यह तालिका के सभी कॉलम पेस्ट करेगा, फिर बस स्तंभों की सूची से पहचान कॉलम को हटा दें ...


मैं सबके साथ सहमत हूं ... लेकिन अगर मैं ऐसा कुछ करने जा रहा था तो मैं इसे इस तरह से कर सकता हूं:

/* Get the data into a temp table */
SELECT * INTO #TempTable
FROM YourTable
/* Drop the columns that are not needed */
ALTER TABLE #TempTable
DROP COLUMN ColumnToDrop
/* Get results and drop temp table */
SELECT * FROM #TempTable
DROP TABLE #TempTable

मैंने ऐसा किया और यह ठीक काम करता है (संस्करण 5.5.41):

# prepare column list using info from a table of choice
SET @dyn_colums = (SELECT REPLACE(
GROUP_CONCAT(`COLUMN_NAME`), ',column_name_to_remove','') 
FROM `INFORMATION_SCHEMA`.`COLUMNS` WHERE 
`TABLE_SCHEMA`='database_name' AND `TABLE_NAME`='table_name');

# set sql command using prepared columns
SET @sql = CONCAT("SELECT ", @dyn_colums, " FROM table_name");

# prepare and execute
PREPARE statement FROM @sql;
EXECUTE statement;

यदि आप मैन्युअल रूप से प्रत्येक कॉलम नाम नहीं लिखना चाहते हैं तो आप Script Table As उपयोग Script Table As पर राइट क्लिक करके या इस तरह एसएसएमएस में देख सकते हैं :

फिर आपको नई क्वेरी संपादक विंडो में पूरी तरह से चयन क्वेरी मिल जाएगी, फिर इस तरह अवांछित कॉलम हटा दें:

किया हुआ


यदि हम प्रक्रियाओं की बात कर रहे हैं, तो यह एक नई क्वेरी उत्पन्न करने के लिए इस चाल के साथ काम करता है और इसे तुरंत लागू करें :

SELECT LISTAGG((column_name), ', ') WITHIN GROUP (ORDER BY column_id)
INTO var_list_of_columns
FROM ALL_TAB_COLUMNS
WHERE table_name = 'PUT_HERE_YOUR_TABLE'
AND column_name NOT IN ('dont_want_this_column','neither_this_one','etc_column');

संक्षेप में आप इसे नहीं कर सकते हैं, लेकिन मैं उपर्युक्त सभी टिप्पणियों से असहमत हूं, वहां "परिदृश्य" हैं जहां आप वैध रूप से * का उपयोग कर सकते हैं * जब आप पूरी सूची से विशिष्ट सीमा का चयन करने के लिए नेस्टेड क्वेरी बनाते हैं (जैसे कि पेजिंग) क्यों दुनिया में बाहरी चयन वक्तव्य पर प्रत्येक कॉलम निर्दिष्ट करना चाहते हैं जब आपने इसे आंतरिक में किया है?


हां यह संभव है (लेकिन अनुशंसित नहीं)।

CREATE TABLE contact (contactid int, name varchar(100), dob datetime)
INSERT INTO contact SELECT 1, 'Joe', '1974-01-01'

DECLARE @columns varchar(8000)

SELECT @columns = ISNULL(@columns + ', ','') + QUOTENAME(column_name)
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'contact' AND COLUMN_NAME <> 'dob'
ORDER BY ORDINAL_POSITION

EXEC ('SELECT ' + @columns + ' FROM contact')

कोड का स्पष्टीकरण :

  1. कॉलम नामों की अल्पविराम से अलग सूची को स्टोर करने के लिए एक चर घोषित करें। यह शून्य पर डिफ़ॉल्ट है।
  2. हमारी तालिका में कॉलम के नाम निर्धारित करने के लिए सिस्टम व्यू का उपयोग करें।
  3. कॉलम नामों को SELECT @variable = @variable + ... FROM उपयोग SELECT @variable = @variable + ... FROM । इस प्रकार का SELECT परिणाम सेट वापस नहीं करता है। यह शायद अनियंत्रित व्यवहार है लेकिन SQL सर्वर के प्रत्येक संस्करण में काम करता है। एक विकल्प के रूप में आप SET @variable = (SELECT ... FOR XML PATH('')) लिए स्ट्रिंग को SET @variable = (SELECT ... FOR XML PATH('')) उपयोग कर सकते हैं।
  4. यदि यह पहला कॉलम नाम नहीं है तो केवल अल्पविराम को ISNULL करने के लिए ISNULL फ़ंक्शन का उपयोग करें। कॉलम नामों में रिक्त स्थान और विराम चिह्न का समर्थन करने के लिए QUOTENAME फ़ंक्शन का उपयोग करें।
  5. कॉलम छुपाने के लिए WHERE क्लॉज का उपयोग करें जिसे हम देखना नहीं चाहते हैं।
  6. रनटाइम पर कॉलम नामों को हल करने के लिए EXEC (@variable) उपयोग करें, जिसे गतिशील एसक्यूएल भी कहा जाता है। इसकी आवश्यकता है क्योंकि हम संकलन समय पर कॉलम नाम नहीं जानते हैं।




tsql