2016-08-12 4 views
0

Ich habe eine Tabelle mit drei Spalten ID, Name, training_run_id, named_entity_id. Ich möchte Ergebnismenge mit zwei Namen Spalten machen, aber mit unterschiedlichen type_idWie verschmelzen zwei Abfragen zu einer Ergebnismenge ohne Duplikate?

SELECT r1.id, r1.f1, r2.id, r2.f1 FROM 
    (
     SELECT id, f1 from RESULT where TRAINING_RUN_ID IN (1,2) AND NAMED_ENTITY_ID = 13 
     GROUP BY ID 
    ) as r1 
    JOIN 
    (
     SELECT id, f1 from RESULT where TRAINING_RUN_ID IN (3,4) AND NAMED_ENTITY_ID = 13 
     GROUP BY ID 
    ) as r2 

Ergebnis der Abfrage ist:

id f1 training_run_id id f1 training_run_id 
27 0.3 2    41 0.5 3 
27 0.3 2    55 0.66 4 
13 0.2 1    41 0.5 3 
13 0.2 1    55 0.66 4 

Ich frage mich, wie diese bekommen ein:

id f1 training_run_id id f1 training_run_id 
13 0.2 1    41 0.5 3 
27 0.3 2    55 0.66 4 
+0

Does h2 Unterstützung row_number()? – Serg

+0

@Serg Ja, h2 unterstützt diese Funktion – eugenn

+0

Welche Beziehung hat ID 13 mit ID 41. Warum zum Beispiel nicht 13 mit 55 in der gleichen Zeile kombinieren? Gibt es eine Regel, die Sie hier anwenden? – trincot

Antwort

1

Ein paar Annahmen (basierend auf OP Kommentare):

  • Ihr 2 Subqueries immer passende Zeile haben zählt
  • Wie die Zeilen übereinstimmen ist unwichtig

Wenn die oben wahr ist, ich glaube, Sie einfach jede Unterabfrage Rückkehr haben rownum, so dass Sie auf, dass beitreten können einen kartesischen Plan zu vermeiden:

SELECT r1.id, r1.f1, r2.id, r2.f1 FROM 
(
    SELECT rownum as rn, id, f1 from RESULT where TRAINING_RUN_ID IN (1,2) AND NAMED_ENTITY_ID = 13 
    GROUP BY ID 
) as r1 
JOIN 
(
    SELECT rownum as rn, id, f1 from RESULT where TRAINING_RUN_ID IN (3,4) AND NAMED_ENTITY_ID = 13 
    GROUP BY ID 
) as r2 
ON r1.rn = r2.rn 

EDIT

Eigentlich nicht zu sicher, ob das oben genannte wird richtig funktionieren, denn wie in der Dokumentation über die rownum function angegeben, scheint es, vor die rownum dieberechnet wird.

Verwenden Sie eine Unterabfrage, um nach der Bestellung und Gruppierung die Zeilennummer abzurufen.

Wenn das der Fall ist, ich glaube, das ist die richtige Frage ist:

SELECT r1.id, r1.f1, r2.id, r2.f1 FROM 
(
    select rownum() as rn, id, f1 
    from (
    SELECT id, f1 from RESULT where TRAINING_RUN_ID IN (1,2) AND NAMED_ENTITY_ID = 13 
    GROUP BY ID 
) t 
) as r1 
JOIN 
(
    select rownum() as rn, id, f1 
    from (
    SELECT id, f1 from RESULT where TRAINING_RUN_ID IN (3,4) AND NAMED_ENTITY_ID = 13 
    GROUP BY ID 
) t 
) as r2 
ON r1.rn = r2.rn 
+0

danke, es funktioniert, wenn "GROUP BY ID" aus der Abfrage entfernen! – eugenn

0

Sie könnten die Qualify-Anweisung verwenden. Ich habe Ihren Code verwendet, um die obige Tabelle zu erstellen. Sie können dann die Daten durch R1.ID partitionieren, die alle Daten in Partitionen auf der Benutzer-ID trennt, dann ordnen Sie die R2 ID absteigend an. Dann qualifizieren Sie die Anweisung durch Row_number() = 1, die den niedrigsten R2-Wert annimmt .ID Nummer innerhalb der Partition und den Rest der Ergebnisse löschen

SELECT r1.id, r1.f1, r2.id, r2.f1 FROM 
     (
      SELECT id, f1 from RESULT where TRAINING_RUN_ID IN (1,2) AND NAMED_ENTITY_ID = 13 
      GROUP BY ID 
     ) as r1 
     JOIN 
     (
      SELECT id, f1 from RESULT where TRAINING_RUN_ID IN (3,4) AND NAMED_ENTITY_ID = 13 
      GROUP BY ID 
     ) as r2 
    QUALIFY (ROW_NUMBER() OVER (PARTITION BY R1.ID ORDER BY R2.ID ASC)) = 1 
+0

Ich dachte nicht, dass H2 Windows-Funktionen wie 'row_number() over 'unterstützt (Partition by ...)'. Wurde das Feature kürzlich hinzugefügt? Oder hast du eine andere Datenbank benutzt? – sstan

+0

Meine schlechte sstan Ich bemerkte Eugenn sagen H2 unterstützt row_number() über – Gablet

Verwandte Themen