2013-02-14 58 views
5

मैं उत्पाद प्रकार के आधार पर उत्पाद के परिणामों के एक अलग सेट का चयन करने का प्रयास कर रहा हूं। तो यदि मेरा उत्पाद एक पुस्तक होना चाहिए, तो मैं इसे सामान्य उत्पाद के लिए यूपीसी और कलाकार को देखना चाहता हूं, हालांकि ये विवरण अप्रासंगिक हैं और दूसरे उत्पाद के लिए मैं परिणामों का एक पूरी तरह अलग सेट चाहता हूं।जब चयन करें (SELECT)

SELECT CASE Product.type_id 
    WHEN 10 THEN (
     SELECT 
     Product.product_id, 
     Product.type_id, 
     Product.product_name, 
     Product.UPC, 
     Product_Type.type, 
     CONCAT_WS(' ' , first_name, middle_name, last_name) AS artistC 
     FROM Product, Product_Type, Product_ArtistAuthor 
     WHERE Product.type_id = Product_Type.type_id 
     AND Product.product_id = $pid 
     AND Product.artist_id = Product_ArtistAuthor.artist_id 
    ) 
    ELSE (
     SELECT 
     Product.product_id, 
     Product.type_id, 
     Product.product_name, 
     Product_Type.type 
     FROM Product, Product_Type 
     WHERE Product.type_id = Product_Type.type_id 
     AND Product.product_id = $pid 
    ) 
END 
FROM Product 
WHERE Product.product_id = $pid 

मैं शुरू पहली चयन 6 स्तंभ होते हैं जहां मैं एक के लिए गलत

+0

एसक्यूएल को fiddle में रखें - sqlfiddle.com –

उत्तर

0

जा रहा हूँ यकीन नहीं है और दूसरा 4 कॉलम शामिल हैं। शायद दोनों में कॉलम की समान संख्या हो (नल जोड़ना?)।

6

आप मामले बयान

CASE WHEN Product.type_id = 10 
THEN 
(
    Select Statement 
) 
ELSE 
(
    Other select statement 

) 
END 
FROM Product 
WHERE Product.product_id = $pid 

अधिक जानकारी के लिए http://msdn.microsoft.com/en-us/library/ms181765.aspx देखें के लिए अन्य प्रारूप का प्रयास किया जा सका।

+2

यह प्रदर्शन के लिए वास्तव में बुरा है। आपको बजाय शामिल होने का उपयोग करना चाहिए, अन्यथा जब भी यह क्वेरी चलता है तो यह प्रत्येक पंक्ति के लिए एक और चयन करेगा। वास्तव में महंगा। कृपया नीचे वैकल्पिक समाधान देखें। –

0

मैंने चयन क्वेरी से सामान्य गुणों को छोड़कर पृष्ठ में बाद में दूसरी चयन क्वेरी बना दी। मैंने पहली चयन क्वेरी के आधार पर विभिन्न स्क्रिप्ट्स के लिए कॉल करने के लिए एक php IF कमांड का उपयोग किया, स्क्रिप्ट में दूसरी चयन क्वेरी थी।

5

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

आपके मामले में नीचे दी गई क्वेरी को मदद करनी चाहिए। ध्यान दें कि केस स्टेटमेंट अभी भी है, लेकिन अब यह एक साधारण तुलना ऑपरेशन है।

select 
    p.product_id, 
    p.type_id, 
    p.product_name, 
    p.type, 
    case p.type_id when 10 then (CONCAT_WS(' ' , first_name, middle_name, last_name)) else (null) end artistC 
from 
    Product p 

    inner join Product_Type pt on 
     pt.type_id = p.type_id 

    left join Product_ArtistAuthor paa on 
     paa.artist_id = p.artist_id 
where 
    p.product_id = $pid 

मैंने बाएं शामिल होने का उपयोग किया क्योंकि मुझे व्यवसाय तर्क नहीं पता है।

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

  • कोई संबंधित समस्या नहीं^_^