2008-12-31 13 views
8

आपके द्वारा कभी देखी गई सबसे खराब SQL क्वेरी क्या है? क्या बुरा बना दिया?सबसे खराब एसक्यूएल कभी

+0

शायद यह एक समुदाय बनाना चाहते हैं WIKI अन्य कोई इसे बंद कर देगा। – JaredPar

+1

वह निश्चित रूप से अपने प्रश्न को विकी बनाने के लिए पर्याप्त प्रतिनिधि है। इसे विकीकृत करें। – ctacke

+0

विकी के रूप में पुनः प्रयास करें। – NotMe

उत्तर

34
DELETE FROM table 

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

+0

ओच ..! मैं पागल हूं, मैं हमेशा शुरू/ट्रैन/रोलबैक के साथ विवरणों को हटा देता हूं, इसे आज़माएं और फिर सुरक्षित महसूस करते समय आंतरिक भाग को निष्पादित करें। –

+4

मैं कुछ ऐसा ही करता हूं, सिवाय इसके कि मैं टेबलनाम को टेबलनाम के रूप में लिखता हूं, जबकि मैं इसे संलेखित कर रहा हूं। मैं पूरे ई-मेल और प्रूफ्रेड लिखने से पहले ई-मेल के "टू:" फ़ील्ड को भी खाली रखता हूं ... बस –

+0

@ocdecio: लेनदेन का समर्थन करने से पहले यह MySQL था :( –

2

* *

वास्तविक बुरा से * चुनें।

+1

* * से चुनें * = '%%'; मैं यह जांचने की हिम्मत नहीं करता कि यह वास्तव में काम करता है या नहीं। –

+0

या कोई भी क्रॉस दो या दो से अधिक उचित टेबल के बीच जुड़ता है। –

+0

दो बड़े लेकिन संकीर्ण तालिकाओं के बीच क्रॉस जॉइनिंग उदाहरण के लिए मिलान सेट के लिए अक्सर एक इष्टतम समाधान होता है - कई से एक आम समस्या – annakata

23

क्लासिक निश्चित रूप से xkcd:

WHERE name = ROBERT'); DROP TABLE students;-- 
+0

आपको इसके लिए नकारात्मक वोट क्यों मिले? यह उल्लसित है! – some

+0

ओह, किसी ने अपना नकारात्मक वोट हटा दिया। – some

+6

हम उसे लिटिल बॉबी टेबल्स कहते हैं –

9

एक ग्राहक एक varchar क्षेत्र (क्लासिक एएसपी आवेदन) में 3 मूल्यों की एक अल्पविराम सीमांकित सूची भंडारण किया गया था ताकि वे एक संग्रहीत प्रक्रिया है कि कुछ इस तरह देखा था:

SELECT * 
FROM 
    SomeTable 
WHERE 
    Field LIKE @Param + ',%' 
    OR 
    Field LIKE '%,' + @Param + ',%' 
    OR 
    Field LIKE '%,' + @Param 

कारण है कि यह भयानक :)

+0

आउच! यह मेरे दांतों को चोट पहुंचाता है! –

+0

मैंने एक बड़े उत्पादन कार्यक्रम में समान चीजें देखी हैं: एस –

+0

क्या यह लिखने का एक बेहतर तरीका है? – Alterlife

1

हाल ही में, मैं एक (से अधिक) 4000 लाइन TSQL संग्रहीत प्रक्रिया था देखा है है यह स्पष्ट होना चाहिए टी पते के हिस्सों के मिलान के लिए आईएफ स्टेटमेंट की एक श्रृंखला थी। इसे 50 से कम लाइनों तक घटाया जा सकता है!

मैं भविष्य में DailyWTF के लिए कोड सहेज रहा हूं!

1
SELECT * FROM some_table; 

यह इतना बुरा क्यों बना था कि कोड टाइमस्टैम्प के आधार पर परिणाम प्राप्त करने पर निर्भर था। इससे पहले कि मैंने इसे ठीक करने के लिए बुलाया था, इससे कुछ समय पहले यह काम करता था।

5
select * from users where clue > 0; 
0 results found. 
+5

इस एसक्यूएल के बारे में सबसे बुरी बात यह है कि यह कभी भी कोई परिणाम नहीं देता है, चाहे आप इसे –

+2

चलाएं, यही कारण है कि हम टिप्पणियों को ऊपर उठाने में सक्षम होना चाहिए:) –

+1

क्या होता है आप इस क्वेरी को स्टैक ओवरफ़्लो डेटाबेस पर क्यों चलाते हैं? क्या यह अभी भी 0 परिणाम लौटाता है? या यह सिर्फ उपयोगकर्ता आईडी 22656 – Kibbee

2

यह शायद सबसे खराब नहीं है, लेकिन मैं अभी तक भी अक्सर यह देखने (Misuse of the group by clause):

SELECT 
    C.CustomerID, C.CustomerName, C.CustomerType, C.Address1, C.City, 
    C.State, SUM(S.Sales) as TotalSales 
FROM 
    Customers C 
INNER JOIN Sales S 
    ON C.CustomerID = S.CustomerID 
GROUP BY 
    C.CustomerID, C.CustomerName, C.CustomerType, C.Address1, C.City, C.State 

के बजाय:

SELECT 
    C.CustomerID, C.CustomerName, 
    C.CustomerType, C.Address1, C.City, 
    C.State, S.TotalSales 
FROM 
    Customers C 
INNER JOIN 
    (SELECT CustomerID, SUM(Sales) as TotalSales FROM Sales GROUP BY CustomerID) S 
ON 
    C.CustomerID = S.CustomerID 
+3

इस पर मुझे कॉल करें आप करेंगे लेकिन मैं असहमत हूं कि एक नियम के रूप में 1 खराब है और 2 अच्छा है। एक और जटिल उदाहरण के साथ, 2 बनाए रखने के लिए काफी कठिन हो जाता है। मेरे लिए, 1 अपने इरादे में बहुत स्पष्ट है और इसके लिए, बनाए रखने के लिए आसान है। 2 बेहतर प्रदर्शन की पेशकश कर सकते हैं लेकिन लाभ इसके लायक नहीं हो सकता है। –

+0

इसके अलावा, नियम 2 mysql के नीचे धीमा है। माई एसक्यूएल--। उत्तरार्द्ध यदि आप इसे अलग करते हैं और अंतिम क्वेरी लिखने के लिए स्ट्रिंग-प्रतिस्थापन का उपयोग करते हैं तो भी अधिक रखरखाव योग्य होता है। इनर जॉइन ($ ग्राहकटॉटल्स): डी –

+0

क्या वाक्यविन्यास 2 के साथ कोई अतिरिक्त शामिल नहीं होगा? रोचक रिफैक्टरिंग के लिए – erikkallen

6

मेरा अपना है, जो दूर है यहां पोस्ट करने के लिए लंबे समय तक - 3500 लाइनों पर बंद करना

मुझे वास्तव में एक बिल्कुल भयानक स्कीमा के साथ दोष साझा करना है। कुछ यूनियनों का उपयोग करके denormalized डेटा pivoting में एक सरल अभ्यास के रूप में शुरू किया क्या एक अनावश्यक दुःस्वप्न में बदल गया। मरम्मत की जरूरत में बुरी तरह से है।

धावक अप यह है:

select 
case datepart(mm,getdate()) 
when 1 then 'Jan' 
when 2 then 'Feb' 
when 3 then 'March' 
when 4 then 'Apr' 
when 5 then 'May' 
when 6 then 'Jun' 
when 7 then 'July' 
when 8 then 'Aug' 
when 9 then 'Sept' 
when 10 then 'Otc' 
when 11 then 'Nov' 
when 11 then 'Dec' 
end 

उस पोस्ट में टाइप की कोई गलती - यह है कि यह कैसे लिखा गया था है। धन्यवाद, परामर्श डॉलर!

पाठ्यक्रम चयन युक्त पुनर्संशोधित की मैं चला गया (datename (मिमी, getdate()), 3)

+0

11 नवंबर और दिसंबर दोनों में मैप किया गया ?? वास्तव में? – abelenky

+15

हमने दिसंबर में इस मणि की खोज की। –

+0

एक कार्यस्थल में जो नामहीन रहेगा, आपका फिक्स वास्तव में फेंक दिया जाएगा क्योंकि यह "सितंबर" और "मार्च" के लिए वर्तनी को तोड़ता है (कभी भी यह नहीं कि यह एक बग को ठीक करता है)। – dreftymac

2

यह ज़ोर से पढ़ें।

select [select],*,star as [as] from [from],[order] order by [by] 
+0

क्या ऐसा कुछ होना चाहिए जैसे http://slashdot.org – Kibbee

4

जब मुझे पहली बार मेरा वर्तमान काम मिला तो मेरा पहला प्रोजेक्ट एक ऐसा ऐप्लिकेशन बनाना था जो हमारे कंप्यूटर प्रयोगशालाओं में हमारे लाइसेंस उपयोग डेटा को सारांशित करता था।उन्होंने जोर देकर कहा कि वह बैकएंड डेटाबेस को सामान्यीकृत नहीं करना चाहते थे क्योंकि जुड़ने "बहुत महंगा" थे। यह मेरा पहला सप्ताह है, मैं बहस करने की स्थिति में नहीं था।

अब, डेटाबेस से किसी भी उपयोगी डेटा को निकालने के लिए, प्रत्येक पंक्ति में डुप्लीकेट डेटा को हटाने के लिए सारांश को निकालने के लिए प्रत्येक क्वेरी में denormalization को "पूर्ववत" करना होगा। बेशक, ये एकमात्र प्रश्न हैं जिनका वास्तव में उपयोग किया जाता है। के लिए होने की प्रक्रिया -

select location, sum(login_time) as total_login_time 
from 
    (select location, session_id, max(login_time) as login_time 
    from sessions 
    where location in ('lab1','lab2') 
      and session_start >= @start_date 
      and session_end <= @end_date 
    group by location, session_id) tbl 
group by location 

हालांकि, क्वेरी ही विशेष रूप से बदसूरत नहीं है - कुछ है, हालांकि: आप नेस्ट चयन, जैसे कि पूरी तरह से अनावश्यक है, तो डेटा सामान्यीकृत थे होगा की एक बहुत कुछ देखना अनावश्यक denormalization दर्द को पूर्ववत करने के लिए हर बार हुप्स के माध्यम से कूदो।

अब बॉस चला गया है, लेकिन मैं इसे फिर से लिखने के लिए समय नहीं है ...

+0

आपके लिए डेटा को denormalise करने के लिए कुछ विचार करें: D –

+1

यह बहुत से स्तरों पर गलत है। विशेष रूप से "बहुत महंगा" होने के बारे में टिप्पणी। –

0

some_table कहां में some_thing से हटाएँ (correct_table से some_column_from_wrong_table का चयन करें जहां some_id = कुछ)।

कुछ_column_from_wrong_table में एक स्तंभ है जो तालिका में भी नहीं था, लेकिन यह एक और तालिका में था। समस्या सही_टेबल को 'इवेंट' नाम दिया गया था और किसी भी तरह से यह पंक्तियों की बजाय सभी पंक्तियों को वापस कर दिया गया था (या अधिक महत्वपूर्ण बात, एक त्रुटि!)।

दो सबक सीखे: कभी भी, किसी भी परिस्थिति में, कभी भी सिस्टम नाम के रूप में एक तालिका का नाम दें। दूसरी बात पहले चयन कथन चलाया गया था, फिर हटाने के लिए बदलें।

यह एसक्यूएल सर्वर 2005 तक था। मैं अभी भी परेशान हूं कि यह एक त्रुटि फेंक नहीं है।

1

एक एक्सेस डेटाबेस में, वहाँ निम्नलिखित की तरह एक प्रश्न था:

SELECT * 
FROM Bad_2 INNER JOIN Bad_1 ON Bad_2.Bad_1_id = Bad_1.ID; 

और दोनों तालिकाओं में एक ही नाम के साथ एक क्षेत्र था। जब एक्सेस दूसरी बार फ़ील्ड नाम में आता है, तो यह इसके लिए एक नया नाम बनाता है। पिछले व्यक्ति ने जेनरेट किए गए फ़ील्ड नाम को कोड में इस्तेमाल किया था।

1

मेरे समय में एसक्यूएल के कई दुखी टुकड़े देखे गए। जो दिमाग में आता है वह

फ़ाइल से लोड डेटा, उस फ़ाइल पर लूप, फ़ाइल में प्रत्येक पंक्ति के लिए डीबी एक्सेस करना है।

प्राथमिक कुंजी लुकअप के लिए भी 10 या तो लाइनों, 100K-1million = बुरा के साथ परीक्षण सिस्टम पर ठीक लगता है।

बीटीडब्ल्यू, समाधान डेटा को डीबी में लोड करना और सेट में सोचना है।

- अपना पसंदीदा लैंग उदाहरण चुनें। मोती, अज़गर ... डेटा संरचना में

लोड फ़ाइल (जैसे सरणी)

for (1 .. n) loop
myid := array[n];
select * from table where id = myid;
if the row exists update table set ... where id = myid;
end loop;

13

सबसे बुरे एक SQL क्वेरी हर की उपयोग:

एक चयन करें क्वेरी है कि संख्या की गणना एक निश्चित स्थिति से संबंधित लाइनों के लिए, लूप के लिए रोक की स्थिति में बुलाया जाता है।
कुछ इस तरह:

for(int i = 0; i < query("SELECT COUNT .... WHERE ..."); i++) 
{ 

} 

और नहीं, क्वेरी का परिणाम हर यात्रा नहीं बदलता है। हां, मुझे एहसास है कि सर्वर परिणाम कैश करने जा रहा है।

4

comp.databases.informix समाचार समूह के लिए एक पोस्टिंग में - एक वास्तविक काम कर इन्फोर्मिक्स तालिका (जो मैं उपयोग करने की अनुशंसा नहीं):

CREATE TABLE VIEW 
(
    DECIMAL  CHAR(30), 
    NOT   INTEGER NOT NULL, 
    SERIAL  DATE NOT NULL, 
    NULL  CHAR(1) NOT NULL, 
    INTEGER  DECIMAL(13,6) NOT NULL 
); 

यह (मामूली) में मदद करता है अगर आप जानते हैं कि सीरियल इन्फोर्मिक्स डेटाबेस में एक प्रकार है - मूल रूप से, स्वचालित रूप से आवंटित संख्याओं को क्रमशः उत्पन्न करने के लिए प्रकारों में से एक।

0

मुझे दैनिक 0t पर एक reposted recently पसंद आया, जो कहानी इसके साथ आता है वह भी अद्भुत है।

8

एक पीएल/एसक्यूएल (ओरेकल) संग्रहित प्रो जो Bubble Sort का उपयोग करके परिणाम सेट को सॉर्ट करता है। यह पता चला था कि जब मैं और डीबीए को गंभीर प्रदर्शन समस्या का पता लगाने के लिए कहा गया था। एक ओरेकल "विशेषज्ञ" डेवलपर ने एक सप्ताह से अधिक समय तक काम किया था। उन्होंने सीधे सीधा चेहरा समझाया कि उन्होंने अपने कंप्यूटर विज्ञान वर्ग में बबल सॉर्ट के बारे में सीखा। एल्गोरिदम आमतौर पर खराब प्रदर्शन को चित्रित करने के लिए उपयोग किया जाता है।

क्लॉज द्वारा ऑर्डर के साथ पूरी गड़बड़ी को बदल दिया। परिमाण के कई आदेशों द्वारा प्रदर्शन में सुधार हुआ।

+0

कुछ ओरेकल सलाहकार हो सकते हैं जो असहनीय रूप से खराब नहीं हैं लेकिन मैंने कभी एक नहीं मुलाकात की है। मैंने एक समूह के साथ काम किया जिसका ओरेकल "विशेषज्ञ" ने चाबियों से बंधे "बैट" फ़ाइलों का उपयोग करके एक संपूर्ण लेखा कार्यक्रम लिखा था। इस प्रकार, "आईबैट" ने चालान फॉर्म चलाया, "आर। बाट" रिपोर्ट चला। हां, यह 90 के उत्तरार्ध में था। –

2

मुझे लगता है कि यह सबसे खराब (विशेष रूप से एक दर्दनाक और अशक्त रोलबैक के बाद) है:

DROP DATABASE; 
ROLLBACK; 
3

SUBSTRING ( (SUBSTRING (अंतिम नाम, 0, CHARINDEX (', अंतिम नाम)) +', ' + प्रथम), 0, CHARINDEX ('', (SUBSTRING (अंतिम नाम, 0, CHARINDEX (', अंतिम नाम)) +', '+ प्रथम), LEN (अंतिम नाम) + 3) )

वे स्पष्ट रूप से आरटीआरआईएम से परिचित नहीं थे;

RTRIM (अंतिम नाम) + ',' + RTRIM (प्रथम)

-1
SELECT name FROM categories WHERE id IN (".implode(",",corrected_cats($ad->id)).") ORDER BY name ASC 

हाँ, यदि आप एक क्षेत्र में है कि सही है ... अल्पविराम से अलग क्षेत्रों पढ़ रहे हैं।

संबंधित मुद्दे