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

जूकी में एक-से-अनेक चयन

JOIN का उपयोग करना इसके लिए काम नहीं करता।

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

"सही" एसक्यूएल दृष्टिकोण का उपयोग करना होगा MULTISET जैसा कि इस लेख में यहां बताया गया है . दुर्भाग्य से, jOOQ 3.9 MULTISET का समर्थन नहीं करता अभी तक (न ही कई डेटाबेस करते हैं)। इसलिए, आपको दो अलग-अलग क्वेरी बनानी चाहिए:

  1. सभी पुस्तकें लाई जा रही हैं
  2. सभी लेख लाए जा रहे हैं

और फिर उन्हें एक ही ऑब्जेक्ट में मैप करने के लिए Java 8 Streams जैसी किसी चीज़ का उपयोग करें।

MULTISET का उपयोग करना jOOQ 3.15

. से शुरू

सौभाग्य से, jOOQ 3.15 से शुरू होकर, SQL में MULTISET का उपयोग करके संग्रह को नेस्ट करने के लिए एक आउट-ऑफ-द-बॉक्स समाधान है। . आपकी क्वेरी कुछ इस तरह दिखेगी:

प्रतिबिंब का उपयोग करना

List<Author> authors =
ctx.select(
      AUTHOR.ID,
      AUTHOR.NAME,
      multiset(
        select(BOOKS.TITLE)
        .from(BOOKS)
        .where(BOOKS.AUTHOR_ID.eq(AUTHOR.ID))
      ).as("books"),
      multiset(
        select(ARTICLES.TITLE)
        .from(ARTICLES)
        .where(ARTICLES.AUTHOR_ID.eq(AUTHOR.ID))
      ).as("articles")
    )
   .from(AUTHOR)
   .where(AUTHOR.ID.eq(id))
   .fetchInto(Author.class);

सुरक्षित प्रकार का उपयोग करना, विज्ञापन -हॉक रूपांतरण

List<Author> authors =
ctx.select(
      AUTHOR.ID,
      AUTHOR.NAME,
      multiset(
        select(BOOKS.TITLE)
        .from(BOOKS)
        .where(BOOKS.AUTHOR_ID.eq(AUTHOR.ID))
      ).as("books").convertFrom(r -> r.map(Record1::value1)),
      multiset(
        select(ARTICLES.TITLE)
        .from(ARTICLES)
        .where(ARTICLES.AUTHOR_ID.eq(AUTHOR.ID))
      ).as("articles").convertFrom(r -> r.map(Record1::value1))
    )
   .from(AUTHOR)
   .where(AUTHOR.ID.eq(id))
   .fetch(Records.mapping(Author::new));

MULTISET के बारे में अधिक जानकारी के लिए , कृपया इस ब्लॉग पोस्ट को देखें , या मैन्युअल अनुभाग:

JOOQ 3.14 से शुरू होकर SQL/XML या SQL/JSON का उपयोग करना

यदि आपका RDBMS इसका समर्थन करता है, तो jOOQ 3.14 से शुरू करके, आप SQL/XML या SQL/JSON के माध्यम से संग्रहों को नेस्ट कर सकते हैं। आप एक दस्तावेज़ तैयार कर सकते हैं, और फिर इसे अपने जावा कक्षाओं में वापस मैप करने के लिए जीसन, जैक्सन, या जेएक्सबी जैसे कुछ का उपयोग कर सकते हैं। उदाहरण के लिए:

List<Author> authors =
ctx.select(
      AUTHOR.ID,
      AUTHOR.NAME,
      field(
        select(jsonArrayAgg(BOOKS.TITLE))
        .from(BOOKS)
        .where(BOOKS.AUTHOR_ID.eq(AUTHOR.ID))
      ).as("books"),
      field(
        select(jsonArrayAgg(ARTICLES.TITLE))
        .from(ARTICLES)
        .where(ARTICLES.AUTHOR_ID.eq(AUTHOR.ID))
      ).as("articles")
    )
   .from(AUTHOR)
   .where(AUTHOR.ID.eq(id))
   .fetchInto(Author.class);

ध्यान दें कि JSON_ARRAYAGG() खाली सेटों को NULL . में एकत्रित करता है , खाली में नहीं [] . अगर यह समस्या है, तो COALESCE() का इस्तेमाल करें




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. MySql पर एकाधिक कॉलम फ़िल्टर करके एकाधिक संख्याओं को कैसे सीमित करें?

  2. MySQL के साथ memcache कैसे काम करता है?

  3. MySQL में दशमलव और हेक्साडेसिमल के बीच कनवर्ट करने के 2 तरीके

  4. क्या होगा यदि 2 या अधिक लोग एक ही समय में एक ही MySQL तालिका को अपडेट करने का प्रयास करते हैं?

  5. mysql एकाधिक कॉलम में सरणी है