2016-08-26 1 views
1

Ich habe zwei Abfragen, die einzeln arbeiten, aber wenn ich versuche, sie zu kombinieren, bekomme ich eine Fehlermeldung: "FEHLER: fehlende FROM-Klausel Eintrag für Tabelle" A ". Der Zweck der Abfragen besteht darin, die kombinierten Ergebnisse zweier Tabellen zu betrachten, die eine JSONB-Spalte im Format ["tag1", "tag2", "tag3"] mit dem Spaltennamen TAGS haben. Beide Abfragen funktionieren einzeln, aber wenn ich versuche Kombiniere sie Ich erhalte den Fehler Ich muss etwas verpasst haben, aber ich habe mehrere Ansätze ausprobiert, aber es gibt keine eindeutige Lösung, wie dieses Problem gelöst werden kann Das Ergebnis sollte eine eindeutige Liste von Tags sein, die die Abfrage mit einem Platzhalter am Ende übereinstimmen Nachstehend finden Sie die Abfragen und deren Kombination: Ich verwende PostgreSQL 9.5.3Jooq Kombination von zwei funktionierenden Abfragen fehlgeschlagen mit FROM Klausel Fehler

final Field<String> value = field(name("A", "value"), String.class); 

    final Table<Record1<String>> c1 = sql.dsl() 
      .selectDistinct(value) 
      .from(CAMPAIGN,lateral(table("jsonb_array_elements_text({0})", CAMPAIGN.TAGS)).as("A")) 
      .where(CAMPAIGN.STORE_KEY.equal(campaign.getStoreKey())) 
      .and(CAMPAIGN.CAMPAIGN_KEY.notEqual(campaignKey)) 
      .and(value.like(search + "%%")) 
      .asTable("c1"); 

    final Table<Record1<String>> c2 = sql.dsl() 
      .selectDistinct(value) 
      .from(STOREFRONT, lateral(table("jsonb_array_elements_text({0})", STOREFRONT.TAGS)).as("A")) 
      .where(STOREFRONT.STORE_KEY.equal(campaign.getStoreKey())) 
      .and(value.like(search + "%%")) 
      .asTable("c2"); 

    final Result<Record1<String>> result = sql.dsl() 
      .selectDistinct(value) 
      .from(c1, c2) 
      .limit(30) 
      .fetch(); 

Antwort

1

Sie müssen eine Union verwenden. Versuchen Sie, diese (nicht einen Arbeitsbereich mit jOOQ zu testen, aber so etwas wie dies funktionieren soll):

final Field<String> value = field(name("A", "value"), String.class); 

final Select<Record1<String>> c1 = sql.dsl() 
     .selectDistinct(value) 
     .from(CAMPAIGN,lateral(table("jsonb_array_elements_text({0})", CAMPAIGN.TAGS)).as("A")) 
     .where(CAMPAIGN.STORE_KEY.equal(campaign.getStoreKey())) 
     .and(CAMPAIGN.CAMPAIGN_KEY.notEqual(campaignKey)) 
     .and(value.like(search + "%%")); 

final Select<Record1<String>> c2 = sql.dsl() 
     .selectDistinct(value) 
     .from(STOREFRONT, lateral(table("jsonb_array_elements_text({0})", STOREFRONT.TAGS)).as("A")) 
     .where(STOREFRONT.STORE_KEY.equal(campaign.getStoreKey())) 
     .and(value.like(search + "%%")); 

final Result<Record1<String>> result = sql.dsl() 
     .selectFrom(c1.asTable()) 
     .union(c2) 
     .limit(30) 
     .fetch(); 
+0

Ich habe gerade versucht, dass und es gibt mir den gleichen Fehler: Verursacht durch: org.postgresql.util .PSQLException: FEHLER: fehlender FROM-Klausel-Eintrag für Tabelle "A" – thurmc

+0

Ich glaube, ich weiß, warum .. 'Wert' ist Aliasing von Tabelle' A', die nicht in der kombinierten Abfrage existiert .. versuchen Sie die letzte Aussage von meine aktualisierte Antwort .. – rohitvats

+0

Das hat funktioniert! mit einer Modifikation: selectFrom nimmt eine übergebene Tabelle, also habe ich c1 in Tabelle > geändert und am Ende der Abfrage .asTable ("c1") hinzugefügt. Danach funktioniert es wie erwartet. Vielen Dank für deine Hilfe! Ich bin ziemlich schrecklich darin, etwas Komplizierteres zu tun als eine grundlegende Auswahl in jooq – thurmc

Verwandte Themen