2011-08-03 15 views
6

पर कुल फ़ंक्शन मैं क्वेरीओवर <> वाक्यविन्यास का उपयोग कर निम्न SQL कथन कैसे लिख सकता हूं?NHibernate QueryOver <> - SubQuery

SELECT COUNT(*) FROM (
    SELECT FirstName,LastName 
    FROM People 
    GROUP BY FirstName, LastName 
    ) as sub_t 

मैं भीतरी क्वेरी अब तक काम कर रहा है:

var q = _session.QueryOver<Person>() 
    .SelectList(l => l 
     .SelectGroup(x => x.FirstName) 
     .SelectGroup(x => x.LastName)); 

लेकिन मैं पता नहीं कैसे एक सबक्वेरी में इस लपेट और एक पंक्ति को इससे बाहर गिनती निकलना है। क्या यह किया जा सकता है?

दुर्भाग्यवश मेरी आरडीबीएमएस बोली (एमएसएसक्लसी 40 डीआईएएलएक्ट) COUNT DISTINCT का समर्थन नहीं करती है इसलिए मुझे SelectCountDistinct() का उपयोग करने का लाभ नहीं है।

उत्तर

0

क्या आपके लिए IQueryOver की रोकाउंट संपत्ति का उपयोग करना संभव नहीं है? इस तरह:

var totalRows = _session.QueryOver<Person>() 
.SelectList(l => l 
    .SelectGroup(x => x.FirstName) 
    .SelectGroup(x => x.LastName)).RowCount(); 
+1

दुर्भाग्यवश ग्रुप BY आपके सुझाव में संरक्षित नहीं है, मैंने एसक्यूएलसी 4 और एसक्यूएल सर्वर 2008 में परीक्षण किया है। जेनरेट की गई क्वेरी "दोनों लोगों में y0_ से [0] इस_" के रूप में चयन करें (*) है। – twerq

1

ठीक है, मैं QueryOver का उपयोग कर behing कारणों को पता नहीं है, लेकिन मैं कुछ इस तरह करना होगा, मुझे लगता है कि आप दे देंगे आप के लिए क्या देख रहे:

Session.CreateCriteria<Person>() 
       .SetProjection(
       Projections.ProjectionList() 
        .Add(Projections.GroupProperty("FirstName"))) 
        .Add(Projections.GroupProperty("LastName"))) 
       .List<Person>().Count(); 

उम्मीद है कि मदद करता है ...

+0

दुर्भाग्यवश वह वांछित एसक्यूएल का उत्पादन नहीं करता है - रिकॉर्ड्स की पूरी सूची (जो कि बहुत बड़ी हो सकती है) को गिने जाने से पहले .NET कोड में लोड किया जाता है। – twerq

1

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

नोट: यह मध्यम डेटा मात्रा के साथ लगभग 10x धीमी है।

सकल विधि

SELECT 
COUNT(DISTINCT FirstName+LastName) 
FROM People 

ठहरें विशेष मामलों

समान संयोजन नाम "जो स्मिथ" बनाम "Joes MITH" (मान लिया गया ~ अपने डेटासेट में नहीं है)

के लिए
SELECT 
COUNT(DISTINCT FirstName+'~'+LastName) 
FROM People 

नल (जैसा sumes ^,

SELECT 
COUNT(DISTINCT IsNull(FirstName,'^')+'~'+IsNull(LastName,'^')) 
FROM People 

सफेद स्थान से पीछे चल रहे अपने डेटासेट में नहीं है) लगता है RTRIM

SELECT 
COUNT(DISTINCT IsNull(RTrim(FirstName),'^')+'~'+IsNull(Rtrim(LastName),'^')) 
FROM People 

तक समूह के लिए स्वाभाविक है बेंचमार्किंग (80k एएमडी पर डेटा की पंक्तियों एकल क्वाड कोर)

80-100ms - रन उप क्वेरी विधि (ओपी देखें)

800-1200ms - डिस्टिंक के साथ कुल विधि टी, विशेष मामलों के लिए समायोजन बहुत ध्यान देने योग्य अंतर प्रतीत नहीं होता है।

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