2012-07-20 12 views
5

मैं एसक्यूएल सर्वर 2008 में निम्न तालिका हैवाम के साथ शामिल हों, टी एसक्यूएल में द्वारा आदेश दिया

CREATE TABLE tbl (ID INT, dtIn DATETIME2, dtOut DATETIME2, Type INT) 

INSERT tbl VALUES 
(1, '05:00', '6:00', 1), 
(2, '05:00', '7:00', 1), 
(3, '05:01', '8:00', 1), 
(4, '05:00', '8:00', 1), 
(5, '05:00', '6:00', 2), 
(6, '05:00', '7:00', 2) 

कि एक ही प्रकार के सभी रिकॉर्ड की आईडी का चयन करता है, एक ही dtIn तारीख के साथ, का आदेश दिया

SELECT DISTINCT tbl.id FROM tbl 
    LEFT JOIN tbl AS t1 
    ON tbl.type = t1.type AND 
    tbl.dtIn = t1.dtIn 
    ORDER BY tbl.dtOut ASC 

लेकिन यह मुझे एक त्रुटि देता है: आरोही क्रम में मोटा द्वारा

ORDER BY items must appear in the select list if SELECT DISTINCT is specified

मैं घ में से है कि आदेश डाल की कोशिश की विचारशील स्थान और यह सब काम नहीं कर रहा है। मुझसे यहां क्या गलत हो रहा है?

+5

त्रुटि संदेश स्पष्ट रूप से कहता है: यदि आप 'चयन डिस्टिंट' का उपयोग कर रहे हैं तो 'ORDER BY' खंड में निर्दिष्ट कॉलम भी चयनित कॉलम की सूची में प्रकट होना चाहिए - इसलिए' SELECT DISTINCT tbl.id का उपयोग करें , tbl.dtOut से ..... ' –

+0

ओह। समझा। इसलिए मुझे उन्हें भी चुनना है। हम्म ... दिलचस्प आवश्यकता ... लेकिन, ओह ठीक है ... – ahmd0

उत्तर

3

जब आप उसे संक्षिप्त व्यक्तिगत पहचान-पत्र, आप की संभावना है कि प्रत्येक आईडी एक से अधिक इसके साथ जुड़े dtOut हो सकता है बनाएँ। जब ऐसा होता है, तो एसक्यूएल सर्वर कैसे पता चलेगा कि किस क्रम का उपयोग करना है?

आप की कोशिश कर सकते:

SELECT t1.id 
FROM tbl t1 
LEFT JOIN tbl t2 on t1.type = t2.type AND t1.dtIn = t2.dtIn 
GROUP BY t1.id, t2.dtOut 
ORDER BY t2.dtOut 

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

+0

यह नहीं करता काम नहीं लग रहा है। आपका कथन उत्पन्न करता है: अस्पष्ट कॉलम नाम 'dtOut'। – ahmd0

+0

फिक्स्ड। खंड द्वारा क्रम में तालिका उपनाम को भूलें। –

+0

इसके अलावा: फिर भी समस्या यह है कि वास्तव में आप जो पूछ रहे हैं उसका कोई मतलब नहीं है। 'कह रहे हैं "फल के इस टोकरी को प्रकार (सेब, संतरे, इत्यादि) द्वारा समूहित करें, इसे प्रत्येक प्रकार के केवल एक ही तक सीमित करें, और फिर प्रत्येक फल को चुनने के समय क्रमबद्ध करें।" डेटाबेस के संदर्भ में, यदि वहां है टोकरी में कई सेब हैं जो सभी अलग-अलग समय पर चुने गए थे, यह वास्तव में नहीं जानता कि किस मूल्य का उपयोग करना है। –

0

आप ORDER BY खंड में केवल उन कॉलम का उपयोग कर सकते हैं जो आपके चयन वक्तव्य का हिस्सा हैं जब आप 'DISTINCT' कुंजी शब्द का उपयोग करते हैं। तो आप केवल tbl.id

यदि आईडी अद्वितीय हैं, तो DISTINCT कीवर्ड कोई समझ नहीं लेता है और प्रदर्शन में गिरावट का कारण बनता है और आप इसे हटा सकते हैं। यदि वे नहीं हैं और आप DISTINCT को रखते हुए tbl.dtOut का चयन करने का निर्णय लेते हैं, तो जोड़ी tbl.id और tbl.dtOut आपको एक ही tbl.id वाली एकाधिक प्रविष्टियां दे सकती है जो शायद वांछित नहीं है।

संभावित कार्यवाही और स्पष्टीकरण के लिए this article जांचें कि इस तरह के प्रश्न प्रतिबंधित क्यों हैं।

0

आपको अपनी चयन सूची में कॉलम tbl.dtOut शामिल करना होगा ताकि यह पता चल सके कि ऑर्डर करना क्या है।

SELECT DISTINCT tbl.id, tbl.dtOut FROM tbl 
    LEFT JOIN tbl AS t1 
    ON tbl.type = t1.type AND 
    tbl.dtIn = t1.dtIn 
    ORDER BY tbl.dtOut ASC 
+0

यह आपके द्वारा रखे गए तरीके से काम करता है। धन्यवाद। – ahmd0

6

यह कॉलम द्वारा ORDER को समझ में नहीं आता है जो DISTINCT आइटमों की सूची में शामिल नहीं है।

चलिए एक साधारण परिदृश्य का उपयोग करते हैं। सबसे पहले, एक मेज FruitPerson:

Fruit 
----- 
Apple 
Peach 
:

SELECT DISTINCT Fruit 
FROM FruitPerson 
ORDER BY PersonName; 

ORDER BY बिना इस क्वेरी के परिणाम इस है:

Fruit PersonName 
----- ------ 
Apple Joe 
Apple Mary 
Peach Karen 
Peach Lance 

क्वेरी बराबर तुम क्या करने की कोशिश कर रहे हैं क्या करने के लिए

लेकिन अब सवाल यह है कि इंजन को इन दो मूल्यों को "ऐप्पल" और "पीच" को PersonName द्वारा कैसे आदेश देना चाहिए? कौन सा व्यक्ति नाम? फल प्रति दो लोग हैं! कौन सा नाम, वास्तव में, यह तय करने के लिए उपयोग करना चाहिए कि Apple या Peach पहले आता है या नहीं?

इसके बजाय, एक समग्र रूप में आपकी क्वेरी पुनर्लेखन:

SELECT Fruit, MinName = Min(PersonName) -- which name to order on 
FROM FruitPerson 
GROUP BY Fruit -- here's how you get your distinctness 
ORDER BY MinName; 
+0

इसे समझाने के लिए धन्यवाद। यह समझ में आता है कि जिस तरह से आप इसे डालते हैं ... मुझे स्वीकार करना चाहिए, एसक्यूएल मेरा किले नहीं है :) और अब मैं एक और मुद्दे से फंस गया हूं :( – ahmd0

+0

यह एक महान स्पष्टीकरण है - मदद के लिए धन्यवाद। –

0

आपको यह त्रुटि हो रही थी क्योंकि आपने चयनित सूची में नहीं रखा था (tbl.dtOut)।

SELECT DISTINCT tbl.dtOut FROM tbl  
    LEFT JOIN tbl AS t1 
    ON tbl.type = t1.type AND 
    tbl.dtIn = t1.dtIn 
    ORDER BY tbl.dtOut ASC 

आप एक परिणाम सेट हो जाएगा (3 पंक्तियों वाले) और आप आईडी क्षेत्र भी तो

SELECT DISTINCT tbl.dtOut, tbl.ID FROM tbl  
    LEFT JOIN tbl AS t1 
    ON tbl.type = t1.type AND 
    tbl.dtIn = t1.dtIn 
    ORDER BY tbl.dtOut ASC 

(6 पंक्तियों होने, यह विशिष्ट संयोजन देता के रूप में आईडी/तारीख चाहते हैं फ़ील्ड)