मेरे पास निम्न क्वेरी है जो एकाधिक तालिकाओं में शामिल होने के लिए जुड़ने का उपयोग करती है

select DISTINCT
        tblArticles.Article_Title, 
        tblArticles.Article_img,
        tblArticles.Article_Content,
        tblArticles.Article_Date_Created,
        tblArticles.Article_Sequence,
        tblWriters.Writer_Name,
        tblTypes.Article_Type_Name, 
        tblimages.image_path as "Extra images"

from tblArticles inner join tblWriters
on tblArticles.Writer_ID_Fkey = tblWriters.Writer_ID inner join
tblArticleType on tblArticles.Article_ID = tblArticleType.Article_ID_Fkey inner join
tblTypes on tblArticleType.Article_Type_ID_Fkey = tblTypes.Article_Type_ID left outer join tblExtraImages
on tblArticles.Article_ID = tblExtraImages.Article_ID_Fkey left outer join tblimages
on tblExtraImages.image_id_fkey = tblimages.image_id

order by tblArticles.Article_Sequence, tblArticles.Article_Date_Created;

और मुझे निम्नलिखित परिणाम मिलते हैं:

enter image description here

यदि किसी लेख में एक से अधिक type_name हैं तो मुझे शेष अभिलेखों के लिए बार-बार कॉलम मिलेंगे। क्या इन तालिकाओं में शामिल होने का कोई और तरीका है जो ऐसा होने से रोकेगा?

-1
ahmad noori 19 मार्च 2020, 03:06

2 जवाब

सबसे बढ़िया उत्तर

सबसे आसान तरीका यह है कि केवल Article_Type_Name कॉलम को सेलेक्ट क्लॉज से हटा दें। यह SELECT DISTINCT को डुप्लिकेट के रूप में पंक्तियों की पहचान करने और उन्हें समाप्त करने की अनुमति देता है।

एक अन्य विकल्प कॉलम पर एकत्रीकरण फ़ंक्शन का उपयोग करना है। हाल के SQL सर्वर संस्करणों में, STRING_AGG() काम आता है (आप MIN() या MAX() का भी उपयोग कर सकते हैं):

select
    tblArticles.Article_Title, 
    tblArticles.Article_img,
    tblArticles.Article_Content,
    tblArticles.Article_Date_Created,
    tblArticles.Article_Sequence,
    tblWriters.Writer_Name,
    string_agg(tblTypes.Article_Type_Name, ',') 
        within group(order by tblTypes.Article_Type_Name) Article_Type_Name_List, 
    tblimages.image_path as Extra_Images
from ..
group by
    tblArticles.Article_Title, 
    tblArticles.Article_img,
    tblArticles.Article_Content,
    tblArticles.Article_Date_Created,
    tblArticles.Article_Sequence,
    tblWriters.Writer_Name,
    tblimages.image_path
1
GMB 19 मार्च 2020, 03:14

आप यहां जो देख रहे हैं वह कार्टेशियन उत्पाद है; आप टेबल्स में इस तरह से जुड़ गए हैं कि एक तरफ से कई पंक्तियाँ दूसरी तरफ की पंक्तियों से मेल खाती हैं

यदि आप article_type के बारे में परवाह नहीं करते हैं, तो अन्य स्तंभों को समूहित करें और max(article_type) लें, या इसे उस सबक्वेरी में छोड़ दें जो लेख प्रकार वाली तालिका से अलग-अलग रिकॉर्ड का चयन करती है, जिसमें लेख प्रकार कॉलम शामिल नहीं है)। यदि आपका SQLS हाल ही में पर्याप्त है और आप उन सभी लेख प्रकारों को जानना चाहते हैं जिन्हें आप STRING_AGG कर सकते हैं उन्हें एक csv सूची में

अंतत: आप जो करना चुनते हैं वह इस बात पर निर्भर करता है कि आप उनके लिए क्या चाहते हैं; पंक्तियों को फ़िल्टर करें, या उन्हें नीचे समूहित करें

1
Caius Jard 19 मार्च 2020, 03:16