2017-01-06 6 views
3

Zunächst möchte ich sagen, dass es sich bei dieser Frage nicht um JOIN oder UNION handelt. Auch gibt es einige Antworten auf Stack-Überlauf, die ich versucht habe, aber ich habe immer noch Probleme. (Beispiel: Multiple queries executed in java in single statement)jdbc - Mehrere Select-Anweisungen in einer Abfrage

Problem:
Ich mag Daten aus zwei Tabellen abzurufen, die ich nicht JOIN oder UNION verwenden, kann tun, da sie verschiedene Arten von Daten enthalten, und ich bin nach unterschiedlicher Anzahl von Zeilen aus jeder Tisch. Der Grund, warum ich es auf einmal machen möchte, ist Effizienz, aber wenn jemand mich davon überzeugen kann, dass zwei Anrufe anstelle von einem fast keinen Unterschied machen, dann werde ich mein Problem gerne lösen (obwohl es immer noch nett wäre) nur)

-Code zu wissen, wie eine Abfrage verwenden:
Basierend auf this, schrieb ich den folgenden Code (Auszug):

String sql = "SET @organizationId = 0;" + 
       "SELECT @organizationId := Id 'Id', Name FROM Organization WHERE Id = ?;" + 
       "SELECT AssociatedOrganizationId FROM OrganizationAssociations WHERE OrganizationId = @organizationId;"; 

     Connection conn = null; 

     try { 
      conn = dataSource.getConnection(); 

      CallableStatement cs = conn.prepareCall(sql); 
      cs.setInt(1, organizationId); 

      boolean isResultSet = cs.execute(); 

      if (!isResultSet) { 
       logger.error("getOrganization - retrieved result is not a ResultSet"); 
      } 

      OrganizationDto organization = null; 

      ResultSet rs = cs.getResultSet(); 
      if (rs.next()) { 
       // create organization object using retrieved data 
      } 

      rs.close(); 

Verhalten das Problem verursacht:

cs.execute() gibt immer false zurück.

Beobachtungen und Aktionen nahm ich zu versuchen, das Problem zu beheben:
Wie bereits erwähnt here und in Java-Dokumentation, Callable zum Aufrufen gespeicherter Prozeduren verwendet zu werden, wurde entwickelt. Gespeicherte Prozeduren selbst geben niemals einen Wert zurück und dies kann nur durch OUT-Parameter erreicht werden. Bedenkt, dass es mich nicht überrascht, dass .execute() false zurückgibt. Ich habe mich verändert jedoch Callablestatement-PreparedStatement und Statement aber, dass in Bezug auf das Ergebnis nicht viel ändern (cs.getResultSet() noch zurück null)

Die Antworten, die ich bin Suche:
1. Ich würde gerne wissen, wie kann ich abrufen Daten aus mehreren Tabellen mit einer Abfrage mit mehreren SELECT-Anweisungen in jdbc erreichen. Das soll ohne JOINS, UNIONS usw. erreicht werden. Ich möchte die Abfrage, die ich schon habe, möglichst nutzen können (die Abfrage funktioniert einwandfrei - getestet in HeidiSQL).
2. (Optional) Wenn es jemanden gibt, der denkt, dass zwei Abfragen keinen großen Unterschied in Bezug auf Datenbanklast und Leistung machen, dann möchte ich überzeugt sein, dass dies tatsächlich der Fall ist.

Update # 1:
zu klären, ist dies die Daten, die meine Abfrage zurückgibt:

ResultSet # 1:
ID, Name
1 "org1_name"

ResultSet # 2:
AssociatedOrganizationId

+0

Verwenden Sie eine Proc, zwei Cursor zurück und verwenden Sie sie, welches Problem Sie in Callable-Anweisung konfrontiert? –

+0

Ist es möglich, die Abfrage so zu verwenden, wie sie ist, anstatt eine gespeicherte Prozedur zu erstellen? Ich komme von .NET Hintergrund und Abfragen wie diese sind nicht ungewöhnlich. Wie beschrieben, gibt CallableStatement.execute() in meinem Fall immer false zurück (wahrscheinlich, weil ich keine gespeicherte Prozedur mit OUT-Parameter anrufe) – JakeDiscBrake

+0

Danke @GordThompson. Wenn jemand anderes bestätigen könnte, dass dies in der Tat die einzige Möglichkeit ist, dies in MySQL zu tun, dann erstelle ich einen gespeicherten Prozess und das ist, wie ich das lösen werde. – JakeDiscBrake

Antwort

-1

Zuerst Ihre beiden Abfragen als eine einzelne Abfrage geschrieben werden können unter Verwendung eines beitreten:

SELECT AssociatedOrganizationId 
FROM OrganizationAssociations oi JOIN 
    Organization o 
    ON oa.OrganizationId = o.id 
WHERE o.id = ? 

Zweitens ist dies nicht einmal erforderlich, weil man die ganze Sache vereinfachen:

SELECT AssociatedOrganizationId 
FROM OrganizationAssociations oi 
WHERE oa.OrganizationId = ? 

Ich würde vorschlagen, dass Sie eine Auszeit nehmen, um SQL zu studieren und zu lernen, wie Datenbanken funktionieren. Es würde Ihnen wahrscheinlich bei den Problemen helfen, die Sie lösen möchten.

+0

Sie gehen davon aus, dass alles, was ich brauche, assoziierte Organisationen IDs sind (nur eine Tabelle). Ich brauche einige Details über Organisation (Organisationstabelle) und Liste der assoziierten Organisationen IDs (OrganizationAssociations Tabelle). Also die Ergebnisse für meine Abfrage sind: {Id, Name} UND {AssociatedOrganizationId}. First ResultSet enthält eine Zeile, die andere kann mehrere Zeilen enthalten. – JakeDiscBrake

+0

scheint Gordons Annahme richtig zu sein. Beweisen Sie uns falsch, indem Sie Beispieldaten und die gewünschte Ausgabe veröffentlichen – e4c5

+0

@ e4c5 - aktualisiert meine Frage – JakeDiscBrake

Verwandte Themen