sql >> Database >  >> RDS >> PostgreSQL

Hoe meerdere rijen te selecteren op basis van hun samengestelde primaire sleutels in JOOQ?

Hoe u dit handmatig doet

U kunt uw SQL-query rechtstreeks naar jOOQ vertalen met DSL.row() om een ​​rijwaarde-expressie te construeren, en dan:

row(TEST_TBL.ID_PART_1, TEST_TBL.ID_PART_2).in(
  row("id_part_1_1", "id_part_2_1"),
  row("id_part_1_2", "id_part_2_2")
);

Zie ook de jOOQ handleiding over de IN predikaat, graad> 1

Gebruik insluitbare sleutels

Als alternatief kunt u profiteren van de extra typeveiligheid die wordt geboden door de nieuwe jOOQ 3.14 <embeddablePrimaryKeys/> functie, waarmee u recordtypen kunt genereren voor alle primaire sleutels en hun verwijzende externe sleutels. Uw vraag zou dan luiden:

ctx.select()
   .from(TEST_TBL)
   .where(TEST_TBL.TEST_TBL_PKEY.in(
      new TestTblPkeyRecord("id_part_1_1", "id_part_2_1"),
      new TestTblPkeyRecord("id_part_1_2", "id_part_2_2")
   ))
   .fetch();

Dit levert dezelfde zoekopdracht op als uw oorspronkelijke, maar typt u veilig en vergeet u nooit meer een sleutelkolom. Niet alleen wanneer u de primaire sleutel opvraagt, maar ook wanneer u zich erbij aansluit! Het wijzigen van de sleutel resulteert in een compilatiefout:

ctx.select()
   .from(TEST_TBL)
   .join(OTHER_TEST_TBL)
   .on(TEST_TBL.TEST_TBL_PKEY.eq(OTHER_TEST_TBL.TEST_TBL_PKEY.TEST_TBL_FKEY))
   .fetch();

Of een impliciete join zou er als volgt uitzien:

ctx.select(OTHER_TEST_TBL.testTbl().fields(), OTHER_TEST_TBL.fields())
   .from(OTHER_TEST_TBL)
   .fetch();



  1. Hoe kan ik rijen retourneren op basis van de databasegebruiker en de inhoud van de tabel?

  2. Hoe kan ik een ddl-script genereren (of krijgen) op een bestaande tabel in Oracle? Ik moet ze opnieuw maken in Hive

  3. Wat vindt u van Postgres- en Firebird-databases?

  4. MySQL:Aantal records met opeenvolgende maanden