2012-09-16 17 views
6

के साथ एकाधिक तालिकाओं से चुनें मुझे बहुमुखी क्वेरी के साथ एक छोटी सी समस्या है। (आरडीबीएमएस: एक्सेस)ग्रुप बाय

यहां डेटाबेस स्कीमा है: (केवल S_Cards, पुस्तकें, लेखक, छात्र तालिका इस क्वेरी में उपयोग की जाती हैं) S_Cards छात्र पुस्तक आदेश (लाइब्रेरी में) है।

DB Scheme

क्वेरी: छात्रों के बीच सबसे लोकप्रिय लेखक (ओं) और इस लेखक की किताबें, जो पुस्तकालय में आदेश दिए थे की संख्या का चयन करें।

हालांकि मैं एक क्वेरी में आदेश + इस तरह लेखकों की सूची प्राप्त कर सकते हैं:

SELECT 
    Students.FirstName & " " & Students.LastName AS [Student], 
    Books.Name AS [Book], Authors.FirstName & " " & Authors.LastName AS [Author] 
FROM 
    Students, 
    Books, 
    S_Cards, 
    Authors 
WHERE 
    S_Cards.ID_Student = Students.ID 
AND S_Cards.ID_Book = Books.ID 
AND Books.ID_Author = Authors.ID 
ORDER BY Authors.LastName 

परिणाम (क्षमा करें, यह रूसी में है):

Query result

मैं समझ नहीं , मैं इस तरह से COUNT और ग्रुप क्यों नहीं कर सकता:

SELECT 
    Students.FirstName & " " & Students.LastName AS [Student], 
    Books.Name AS [Book], 
    COUNT(Authors.FirstName & " " & Authors.LastName) AS [Number of books] 
FROM Students, Books, S_Cards, Authors 
WHERE 
    S_Cards.ID_Student = Students.ID 
AND S_Cards.ID_Book = Books.ID 
AND Books.ID_Author = Authors.ID 
GROUP BY 3 

मुझे एक त्रुटि मिलती है 'लेखक' फर्स्टनाम & "& लेखक। लास्टनाम 'स्थिर कार्य या समूह का हिस्सा नहीं है।

सवाल:

  1. वहाँ केवल ग्रुप द्वारा, का चयन करें, संघ और कैसे द्वारा, JOIN के बिना इस क्वेरी करने के लिए एक तरीका है?
  2. मेरी दूसरी क्वेरी में क्या समस्या है?

उत्तर

0

एसक्यूएल सर्वर में स्ट्रिंग concatenation operator+ नहीं & है। साथ ही, आपको उन चीजों से समूह करना चाहिए जो एक समग्र कार्य नहीं हैं।

SELECT Students.FirstName + ' ' + Students.LastName AS [Student] 
    , Books.Name AS [Book] 
    , COUNT(Authors.FirstName + ' ' + Authors.LastName) AS [Number of books] 
    FROM Students 
    JOIN S_Cards 
    ON S_Cards.ID_Student = Students.ID 
    JOIN BOOKS 
    ON S_Cards.ID_Book = Books.ID 
    JOIN Authors 
    ON Books.ID_Author = Authors.ID 
GROUP BY Students.FirstName + ' ' + Students.LastName 
     , Books.Name 

कृपया ध्यान दें कि मैं मानक एएनएसआई करने के लिए आपकी क्वेरी बदल दिया है वाक्य रचना है, जो त्रुटियों कि बहुत कठिन बनाने के लिए बनाता है और बहुत आसान को पढ़ने के लिए है में शामिल हो।

इसके बारे में सोचकर, आपकी गिनती थोड़ा अजीब लगती है। COUNT(Books.ID) किताबों की संख्या नहीं है?

+0

यह _assumes_ आप एसक्यूएल सर्वर का उपयोग कर रहे हैं (यह यह तरह दिखता है)। भविष्य में उचित आरडीबीएमएस के साथ हमेशा प्रश्नों को टैग करें। – Ben

+0

उत्तर के लिए धन्यवाद। मुझे लगता है कि COUNT (Books.ID) कुछ पुस्तक का आदेश दिया गया था। मुझे यह समझने की ज़रूरत है कि लेखक द्वारा कितनी बार किसी पुस्तक को आदेश दिया गया था, कुछ विशेष पुस्तक नहीं। आरडीबीएमएस एक्सेस है। – Aremyst

0

आप चाहिए कुछ भी द्वारा समूह है कि एक समग्र समारोह का हिस्सा नहीं है:

SELECT 
    Students.FirstName & " " & Students.LastName AS [Student], 
    Books.Name AS [Book], 
    COUNT(Authors.FirstName & " " & Authors.LastName) AS [Number of books] 
FROM Students, Books, S_Cards, Authors 
WHERE 
    S_Cards.ID_Student = Students.ID 
AND S_Cards.ID_Book = Books.ID 
AND Books.ID_Author = Authors.ID 
GROUP BY Students.FirstName & " " & Students.LastName, 
    Books.Name AS [Book] 

मैं सुझाव है कि आप अंतर्निहित मिलती बजाय स्पष्ट का उपयोग शुरू। अधिकांश भाग के लिए एमएस एक्सेस के लिए बेहतर विकल्प है।

<...> 
FROM Students 
INNER JOIN S_Cards 
ON Students.ID = S_Cards.ID_Student 

या

<...> 
FROM Students 
LEFT JOIN S_Cards 
ON Students.ID = S_Cards.ID_Student 

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

1

समाधान (older revision in question से निकाली गई):

SELECT TOP 1 Author, COUNT(Book) AS [Number of books] FROM 
(
    SELECT 
     Students.FirstName & " " & Students.LastName AS [Student], 
     Books.Name AS [Book], 
     Authors.FirstName & " " & Authors.LastName AS [Author] 
    FROM 
     Students, 
     Books, 
     S_Cards, 
     Authors 
    WHERE 
     S_Cards.ID_Student = Students.ID AND 
     S_Cards.ID_Book = Books.ID AND 
     Books.ID_Author = Authors.ID 
    ORDER BY Authors.LastName 
) 
GROUP BY Author 
ORDER BY 2 DESC 
संबंधित मुद्दे