2009-03-11 3 views
0

Ich habe ein interessantes Problem für Interbase. Ich habe einen Datensatz, der unter anderem ein Dateneingabefeld und einen Zeitstempel für jeden Datensatz enthält. Ich möchte in der Lage sein, die Zeitstempel von den Aufzeichnungen zu kopieren, so dass am Ende des Tages das letzte Feld entlang der Linien lesen:Wie kann ich Daten innerhalb einer DB-Tabelle mit einer SQL-Anweisung zusammenführen?

TIMESTAMP <Carriage return> <carriage return> Original data in field 

So das endgültige Aussehen, wenn das Feld angezeigt wird, ist:

time of entry 

data that was entered 

Leider muss dies auf Datenbankebene durchgeführt werden, da ich keinen Zugriff auf die Front-End-Software habe.

Die einzige Lösung, die ich in der Lage gewesen bin, zu tun ist zu tun, zu wählen, benutzerdefinierte Software verwenden, um die Zusammenführung durchzuführen und dann das entsprechende SQL Zeile für Zeile zu generieren, um den Datensatz zu aktualisieren. Da es mehrere hundert Datensätze pro Tag gibt, ist dies eher langsam, daher wäre eine SQL-basierte Lösung ideal.

In der Vergangenheit ist es mir gelungen, feste Daten am Ende eines Strings unter Verwendung von || zur Verkettung mit einer UPDATE Anweisung hinzuzufügen (Daten || zusätzliche Information, die für alle Datensätze gleich ist), aber es ist schwierig, dies zu erledigen das Format:..

result of search||original data 

Jede Hilfe geschätzt viel würde

+0

Es würde helfen, wenn Sie die Struktur Ihrer Tabelle zeigen. Z.B. die Anweisung "CREATE TABLE", mit der Sie die Tabelle definiert haben. Leute können eine genauere Antwort geben, wenn sie die Datentypen, Feldnamen usw. kennen. –

Antwort

1
UPDATE FOO_TABLE 
    SET DATA_ENTRY_FIELD = DATA_ENTRY_FIELD || TIMESTAMP_FIELD 
WHERE ...; 

das sollte funktionieren (DATA_ENTRY_FIELD bietet Platz für die Verkettung zur Verfügung gestellt) Bitte spezifischere über welche Probleme Sie mit wenn es nicht funktioniert.

0

Craig Antwort sollte funktionieren, obwohl, wenn Sie die Zeilenumbrüche wollen, werden Sie diese natürlich auch einsetzen müssen:

UPDATE foo_table 
SET  data_entry_field = timestamp || '\n\n' || data_entry_field 
WHERE ... 

(Unter der Annahme, dass Interbase \n als Wagenrücklauf akzeptiert - die eigentlich nur sein sollte \r oder sogar \r\n auf Windows, aber \n ist ziemlich Standard.)

MySQL den || Verkettungsoperator nicht erkennt, und so würden Sie stattdessen die CONCAT() Funktion verwenden. Interbase könnte dasselbe sein.

+0

Nein, IB erkennt '\ n' nicht. OTOH, es erkennt einen * tatsächlichen * Wagenrücklauf (kann das nicht in einem Kommentar zeigen, aber stell dir ein 'gefolgt von Enter und dann' in einer neuen Zeile vor. Es ist komisch, aber es funktioniert. –

Verwandte Themen