# Eintragung in einer Spalte nach Abfrage



## Taramsis (2. Sep 2009)

Hi Leute ,

ich mache folgende Abfrage in einer Methode:


```
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?


----------



## thE_29 (2. Sep 2009)

Welche Datenbank hast du den im Einsatz? Bei Oracle (glaube auch MSSQL) kann man da Trigger einbauen, welche das machen..


----------



## Taramsis (2. Sep 2009)

Hi,

ich benutze mySql! Wie würde ich den solch einen Trigger einsetzen?


----------



## Taramsis (4. Sep 2009)

Hi Leute,

vielleicht frage ich zu Kompliziert!
Ich mach mal ein Bsp.:
folgende Tabelle ist gegeben:

```
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:


```
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:

```
stmt2.executeUpdate("UPDATE modules." + choices[i-1] + " " +
                               "SET TaskProcessed = '1' " +
                               "WHERE " + choices[i-1] + ".TaskStart='" + minStart + "' ");
```
Klappt leider nicht ganz!


----------



## Michael... (4. Sep 2009)

Taramsis hat gesagt.:


> Klappt leider nicht ganz!


Was klappt nicht ganz? Gibt's (Fehler)meldungen?

TaskStart erwartet eventuell ein Datum und Du übergibst einen String.

PS: Verwende doch PreparedStatements


----------



## Taramsis (4. Sep 2009)

Es gibt keine Fehlermeldung, es steht keine 1 bei TaskProcessed unter der verwendeten minStart bzw. nirgendwo!
Wie sieht ein PreparedStatements aus?


----------



## Michael... (4. Sep 2009)

So z.B.

```
PreparedStatement stmt = connection.prepareStatement("Update myTable Set TaskProcessed=? Where TastStart= ?");
stmt.setString(1, "1");
stmt.setDate(2, minStart);
stmt.executeUpdate();
```


----------



## Taramsis (4. Sep 2009)

sorry den Part verstehe ich nicht ganz:


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

In Sachen Datenbanken bin ich ne Nuss!


----------



## Michael... (4. Sep 2009)

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


----------



## Taramsis (4. Sep 2009)

Danke!


----------



## Taramsis (7. Sep 2009)

Hi,

ich versuch nun folgendes

```
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


```
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!


----------



## Taramsis (9. Sep 2009)

Hi Leute, 
ich habe nun folgendes ausprobiert und es klappt!

```
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:


```
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'


----------

