2010-04-29 13 views
5

मैं एक का चयन करें बयान के साथ एक संग्रहीत प्रक्रिया मिल गया है, इस तरह के साथ की आवश्यकता है। यह Books टेबल है:एक सशर्त SELECT कथन

Books: 
book_ID INT, 
author_ID INT, 
book_title NVARCHAR, 
featured_book BIT 

मुझे क्या करना चाहते हैं सशर्त ऊपर का चयन करें बयान के भाग के रूप में प्रत्येक लेखक द्वारा विशेष रुप से पुस्तक की आईडी का चयन है, और किसी दिए गए लेखक के लिए कोई भी पुस्तकें विशेष रुप से प्रदर्शित कर रहे हैं , पुस्तक तालिका से लेखक द्वारा पहली (शीर्ष 1) पुस्तक की आईडी का चयन करें। मैं इस से कैसे संपर्क करूं?

+0

"पहली" पुस्तक से आपका क्या मतलब है? क्या आदेश दिया? क्या आपको बस * कोई * पुस्तक लाने का मतलब है? –

+0

सही - यथार्थवादी, उस लेखक द्वारा कोई भी पुस्तक। मेरा मतलब है book_ID द्वारा आदेश दिया गया शीर्ष 1। – Ethan

उत्तर

1

आप एक उप क्वेरी जो डेटा का आदेश देता है और शीर्ष कथन का उपयोग करती उपयोग कर सकते हैं ... की तर्ज पर

कुछ,

SELECT author_ID, 
     author_name, 
     author_bio 
     , (Select top 1 Book_ID from Books where Authors.Author_ID=Books.Author_ID order by Featured_book desc) 
FROM Authors 
WHERE author_ID in (SELECT author_ID from Books) 
1

इस प्रयास करें:

DECLARE @Authors table (author_ID INT NOT NULL, author_name VARCHAR(100) NOT NULL, author_bio VARCHAR(100) NOT NULL) 
INSERT INTO @Authors VALUES (1, 'Author1', 'Bio1') 
INSERT INTO @Authors VALUES (2, 'Author2', 'Bio2') 
INSERT INTO @Authors VALUES (3, 'Author3', 'Bio3') 

DECLARE @Books table (book_ID INT NOT NULL, author_ID INT NOT NULL, book_title VARCHAR(100) NOT NULL, featured_book INT NOT NULL) 
INSERT INTO @Books VALUES (1, 2, 'Book1', 0) 
INSERT INTO @Books VALUES (2, 2, 'Book2', 1) 
INSERT INTO @Books VALUES (3, 3, 'Book3', 0) 
INSERT INTO @Books VALUES (4, 3, 'Book4', 0) 

SELECT 
    dt.author_ID, dt.author_name,dt.author_bio,dt.book_title 
    FROM (
      SELECT 
       a.*,b.book_title,ROW_NUMBER() OVER (PARTITION by a.author_ID ORDER BY b.featured_book DESC,b.book_title) RowNumber 

      FROM Authors    a 
       LEFT OUTER JOIN Books b ON a.author_id = b.author_id 
     ) dt 
WHERE dt.RowNumber= 1 

आउटपुट :

author_ID author_name author_bio book_title 
----------- ------------ ----------- ---------- 
1   Author1  Bio1  NULL  
2   Author2  Bio2  Book2  
3   Author3  Bio3  Book3  

(3 row(s) affected) 
+0

जैसा कि मैं सवाल समझता हूं, किताबों के बिना लेखक नहीं चाहते हैं। 'यह सीमा उन लेखकों के परिणाम देती है जिनके पास पुस्तक रिकॉर्ड हैं। –

+0

@ मार्क बेयर्स, मैंने इस तरह से सवाल नहीं पढ़ा। आपका प्रश्न "प्रश्न मैं चाहता हूं ..." खंड का हिस्सा नहीं है। ओपी केवल उल्लेख करता है कि उनके पास एक संग्रहित प्रक्रिया है ... यह सीमाएं ... आदि –

0
Select X.*, BB.book_title from 
(
    SELECT A.author_ID, A.author_name, A.author_bio, 
     (Select top 1 book_ID from Books B WHERE B.author_ID = A.author_ID 
     order by B.featured_book, book_Title) as book_ID, BB.book_Title 
    FROM Authors A 
)X right join Books BB on X.book_id = BB.book_ID 
+0

क्षमा करें, यह गलत है। मैंने पोस्ट को गलत तरीके से पढ़ाया। – souLTower

0

संबंध में सिद्धांत में आदेश नहीं है। इसलिए "पहली पुस्तक" आदर्श को कुछ समेकन नियम द्वारा निर्दिष्ट किया जाना चाहिए। यदि आप "min (bookID)" से संतुष्ट हैं तो कुछ ऐसा:

SELECT Authors.author_ID, author_name, author_bio, 
    CASE max(featured_book) 
    WHEN 0 THEN min(book_ID) 
    END 
FROM Authors INNER JOIN 
    Books ON Authors.author_ID = Books.author_ID 
GROUP BY Authors.author_ID, author_name, author_bio 
संबंधित मुद्दे