Eintragung in einer Spalte nach Abfrage

Status
Nicht offen für weitere Antworten.

Taramsis

Bekanntes Mitglied
Hi Leute ,

ich mache folgende Abfrage in einer Methode:

Java:
Object[][] list = null; 

try {
    int listSize = 0;
    Object[] choices = managerAlg.getSortPriority().sortedPriorities();
    Class.forName(driver);
    con = (Connection) DriverManager.getConnection(url + "modules"  , user, pass);
    stmt = (Statement) con.createStatement();

    res2 =  (ResultSet) stmt.executeQuery( "SELECT " +  this.createSelectString() + " " +
                                          "FROM " + this.createFromString() + " " + 
                                                    this.createJoinString() + " " );
    while (res2.next()) {
        listSize++;
    }
    res2.first();

    minStart = new Date();

    int listWidth = managerAlg.getSortPriority().sortedPriorities().length +1;
    if (listSize > 0) {
        list = new Object[listSize][listWidth];
        for (int j = 0; j < listSize; j++) {
            for (int i = 1; i < listWidth; i++) {
            Date date = res2.getTime(choices[i-1] + ".TaskStart");
            if (date.before(minStart)) {
                minStart = date;
            }
            list[j][i] = minStart;
            }
            res2.next();
        }
    }
    con.close();

}
catch(Exception e) {
    e.printStackTrace();
}
//System.out.println(minStart);    
return minStart;

Ich habe mehrere Tabellen, die gleich aufgebaut sind und möchte immer die mindest Startzeit von Spalte "TaskStart" wissen. Ich joine die Tabellen und führe meine Abfrage dann durch!
Nun gibt es eine Spalte die "TaskProcessed" ( in jeder Tabelle natürlich) lautet und vom Typ "int(1)" ist. Hier möchte ich nach der Abfrage ein "1" eintragen, damit ich die Abfrage nur bei TaskProcessed=0 mache.
Wie könnte ich solch ein Update nach einer Abfrage durchführen?
 
Welche Datenbank hast du den im Einsatz? Bei Oracle (glaube auch MSSQL) kann man da Trigger einbauen, welche das machen..
 
Hi Leute,

vielleicht frage ich zu Kompliziert!
Ich mach mal ein Bsp.:
folgende Tabelle ist gegeben:
SQL:
Tabelle airportCenterSanFransisco
ID   destination 	flight_cost 	StartTime    Flag
1    Los Angeles 	1500€ 	        06:13        0
2    San Diego 	    250€ 	        07:13        0
3    Los Angeles 	500€ 	        08:13        0
4    Boston 	    700€ 	        09:13        0

Nun bestimme ich die Mindest Startzeit "minStart" durch:

Java:
for (int j = 0; j < listSize; j++) {
    for (int i = 1; i < listWidth; i++) {
        Date date = res2.getTime(choices[i-1] + ".TaskStart");
        if (date.before(minStart)) {
            minStart = date;
            
        }
        list[j][i] = minStart;
    }
    res2.next();
}

Wenn man sich nun vorstellt ich hätte zehn Flughäfen in San Fransico und dementsprechend zehn Tabellen wie oben, will ich , wenn er den "minStart" ermittelt den Flag der Zeile der gejointen Tabellen bei denen die z.B. ID=1 ist und "minStart" vorhanden ist auf 1 setzen!

Ich dachte an soetwas:
Java:
stmt2.executeUpdate("UPDATE modules." + choices[i-1] + " " +
                               "SET TaskProcessed = '1' " +
                               "WHERE " + choices[i-1] + ".TaskStart='" + minStart + "' ");
Klappt leider nicht ganz!
 
Es gibt keine Fehlermeldung, es steht keine 1 bei TaskProcessed unter der verwendeten minStart bzw. nirgendwo!
Wie sieht ein PreparedStatements aus?
 
So z.B.
Java:
PreparedStatement stmt = connection.prepareStatement("Update myTable Set TaskProcessed=? Where TastStart= ?");
stmt.setString(1, "1");
stmt.setDate(2, minStart);
stmt.executeUpdate();
 
sorry den Part verstehe ich nicht ganz:

Java:
stmt.setString(1, "1");
stmt.setDate(2, minStart);
stmt.executeUpdate();

In Sachen Datenbanken bin ich ne Nuss!😳
 
Zeile 1 erzeugt das PreparedStatement mit zwei Platzhaltern (=> ?)
Zeile 2 setzt den Inhalt für den ersten Platzhalter
Zeile 3 setzt den Inhalt für den zweiten Platzhalter
Zeile 4 führt das Statement aus
 
Hi,

ich versuch nun folgendes
SQL:
UPDATE airport SET flag=true WHERE start=(SELECT min(start) FROM airport);

auf meiner DB anzuwenden!
Ich habe eine DB "modules" hier habe ich drei Tabellen m1,m2,m3 und diese haben die gleiche Struktur. Ich joine per SQL die Tabellen:
Meine Tabellen sehen alle so aus:
TaskCommonDim|Resource|TaskStart|TaskEnd|Piority|TaskProcessed

TaskStart ist vom Typ Datetime und
"TaskProcessed" vom Typ int(1), d.h. es kann 0 oder 1 sein

SQL:
SELECT m1.TaskCommonDim, m1.TaskStart, m1.TaskProcessed, m2.TaskStart, m2.TaskProcessed, m3.TaskStart, m2.TaskProcessed
FROM m1 AS m1
JOIN m2 AS m2 ON ( m1.TaskCommonDim = m2.TaskCommonDim )
JOIN m3 AS m3 ON ( m1.TaskCommonDim = m3.TaskCommonDim )
WHERE m1.TaskProcessed = '0' AND m2.TaskProcessed = '0' AND m3.TaskProcessed = '0'
Wie kann ich meine Join-Anfrage mit der obigen Update-Anfrage kombinieren? Ich möchte praktisch die kleinste Startzeit aus allen Tabellen und dann "TaskProcessed" in der entsprechenden Zeile der gejointen Tabelle auf 1 setzen!
 
Hi Leute,
ich habe nun folgendes ausprobiert und es klappt!
SQL:
SELECT min(X.TaskStart)  FROM  
(    SELECT * FROM m1    
     UNION ALL    
     SELECT * FROM m2    
    UNION ALL    
    SELECT * FROM m3  
 ) AS X
 WHERE TaskProcessed = 0

Nun habe ich probleme dieses UPDATE noch einzu bauen. Ich dacht ich mach folgendes:

SQL:
UPDATE m1 SET TaskProcessed = true WHERE TaskStart =
(
  SELECT min(TaskStart)
  FROM
  (
    SELECT * FROM m1
    UNION ALL
    SELECT * FROM m2
    UNION ALL
    SELECT * FROM m3
  )
  WHERE TaskProcessed = 0
)

UPDATE m2 SET TaskProcessed = true WHERE TaskStart =
(
  SELECT min(TaskStart)
  FROM
  (
    SELECT * FROM m1
    UNION ALL
    SELECT * FROM m2
    UNION ALL
    SELECT * FROM m3
  )
  WHERE TaskProcessed = 0
)

UPDATE m3 SET TaskProcessed = true WHERE TaskStart =
(
  SELECT min(TaskStart)
  FROM
  (
  SELECT * FROM m1
  UNION ALL
  SELECT * FROM m2
  UNION ALL
  SELECT * FROM m3
  )
  WHERE TaskProcessed = 0
)
Ich weiß nicht recht wie ich die "Aliase"(AS X,..) setzen soll! Wenn ichs wie oben mache, also nur bei "min(TaskStart)" und z.B. X,Y,Z nutze, kommt folgende Meldung:
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'AS X'
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Zurück
Oben