Sqlserver
 sql >> डेटाबेस >  >> RDS >> Sqlserver

ग्रुप बाय और ऑर्डर बाय क्लॉज में SQL क्वेरी एरर

जब आप GROUP BY . का उपयोग कर रहे हों आपके पास आमतौर पर एग्रीगेट फंक्शन होंगे। , आपके द्वारा प्रदान किया गया SQL वास्तव में इसमें कोई समग्र कार्य नहीं करता है इसलिए इसे समूहीकृत करने की कोई आवश्यकता नहीं है।

SELECT  
    m.Message_Id 
    , m.Chat_Relation_Id AS relation_id 
    , m.SenderId AS datetime 
    , m.Text_Message 
    , m.Subject 
    , m.DateTime
FROM  
    [AppResource].[dbo].[ChatMessage] AS m  
    INNER JOIN [AppResource].[dbo].[chatRelation] AS r 
    ON r.Chat_Relation_Id = m.Chat_Relation_Id 
WHERE  
    r.User1Id = 1 
ORDER BY  
    m.DateTime DESC

त्रुटि फेंकी जा रही है क्योंकि सभी गैर-समग्र स्तंभों को GROUP BY . में परिभाषित किया जाना चाहिए खंड के रूप में यह परिभाषित करता है कि अन्य (कुल) स्तंभों की गणना कैसे की जाती है। आपके उदाहरण में और वर्णित समस्या को देखते हुए, मैं केवल GROUP BY को हटाने का अनुमान लगा रहा हूं आपकी समस्या का समाधान करेंगे।

SELECT  
    m.Message_Id 
    , m.Chat_Relation_Id AS relation_id 
    , m.SenderId AS datetime 
    , m.Text_Message 
    , m.Subject 
    , m.DateTime
FROM  
    [AppResource].[dbo].[ChatMessage] AS m  
    INNER JOIN [AppResource].[dbo].[chatRelation] AS r 
    ON r.Chat_Relation_Id = m.Chat_Relation_Id 
WHERE  
    r.User1Id = 1 
ORDER BY  
    m.DateTime DESC

डुप्लीकेट प्रविष्टियों के संबंध में टिप्पणी के बाद संपादित करें:

निम्नलिखित क्वेरी को प्रत्येक Chat_Relation_Id . के लिए नवीनतम प्रविष्टि मिलेगी

SELECT  
    m.Chat_Relation_Id AS relation_id 
    , MAX(m.DateTime) AS maxDateTime
FROM  
    [AppResource].[dbo].[ChatMessage] AS m  
    INNER JOIN [AppResource].[dbo].[chatRelation] AS r 
    ON r.Chat_Relation_Id = m.Chat_Relation_Id 
WHERE  
    r.User1Id = 1 
GROUP BY 
    m.Chat_Relation_Id 

यह आदर्श से बहुत दूर है, लेकिन प्रासंगिक पाठ का चयन करने के लिए उप क्वेरी के रूप में इस्तेमाल किया जा सकता है:

SELECT  
    m.Message_Id 
    , m.Chat_Relation_Id AS relation_id 
    , m.SenderId AS datetime 
    , m.Text_Message 
    , m.Subject 
    , m.DateTime
FROM  
    (SELECT  
        subqueryMessage.Chat_Relation_Id AS relation_id 
        , MAX(subqueryMessage.DateTime) AS maxDateTime
    FROM  
        [AppResource].[dbo].[ChatMessage] AS subqueryMessage  
        INNER JOIN [AppResource].[dbo].[chatRelation] AS subQueryRelation 
        ON subQueryRelation.Chat_Relation_Id = subqueryMessage.Chat_Relation_Id 
    WHERE  
        subQueryRelation.User1Id = 1 
    GROUP BY 
        subqueryMessage.Chat_Relation_Id 
    ) AS mySubQuery
    INNER JOIN [AppResource].[dbo].[ChatMessage] AS m  
    ON  m.Chat_Relation_Id = mySubQuery.relation_id
        AND m.DateTime = mySubQuery.maxDateTime
ORDER BY  
    m.DateTime DESC

मुझे इस तरह की उप-प्रश्नों का उपयोग करना पसंद नहीं है, लेकिन मैं एक डेवलपर हूं जो डीबीए नहीं है, और उपरोक्त सीमित है कि यदि समान Chat_Relation_Id वाले आइटम हैं और DateTime तो डुप्लीकेट अभी भी घटित होंगे। HAVING का उपयोग करके इसे करने का शायद एक चतुर तरीका है खंड लेकिन उम्मीद है कि अगर यह आपको काम करने के लिए कुछ नहीं देता है तो इससे किसी और को आपकी समस्या का समाधान करने में मदद मिलेगी।




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SQL सर्वर (T-SQL) में HTML तालिका के रूप में ईमेल क्वेरी परिणाम

  2. SQL सर्वर में TSQL और GUI द्वारा तालिका में पहचान कॉलम कैसे जोड़ें - SQL सर्वर / T-SQL ट्यूटोरियल भाग 40

  3. एसक्यूएल सर्वर 2008 में छवि डेटाटाइप को वर्चर में कनवर्ट करें:

  4. SQL सर्वर में क्लॉज द्वारा ओवर क्लॉज और पार्टिशन के साथ रनिंग टोटल की गणना करना

  5. नई और पुरानी आईडी कैप्चर करने के लिए OUTPUT का उपयोग कैसे करें?