Hallo,
ein Subselect macht im JOIN auch keinen Sinn. Das würde den Sinn vo JOIN komplett außer Kraft setzen. Du kannst aber im JOIN joinen:
SELECT * FROM a INNER JOIN (b INNER JOIN c ON (b.id=c.id)) ON (b.id=a.id))
... oder so ähnlich. Hab grad kein Beispiel zur Hand. Such mal nach "Verschachtelten Joins" oder "assoziativen Joins"
VlG
Die Datenbank ist "noch" recht klein, ca. 6 MB, kann aber auch größer werden. Sie liegt im Intranet.
Das Restore-Prinzip könnte schwierig werden, da es tatsächlich sein könnte, dass mehrere Leute gleichzeitig auf verschiedene Versionen zugreifen. Diese Datenbank verwaltet Produkteigenschaften, werden ältere Produktversionen geändert, müsste auch die Datenbank zu dieser Produktversion geändert werden.
Wenn die Datenbank sowas slebst tut, wär das natürlich der Hit. Zur Not würde ich halt für jede neue Version alle Tabellen der Datenbank kopieren und irgendwo die zu einer Version gehörenden Tabellen auflisten...
Guten Tag.
Ich versuche gerade mein geschriebenes Script in die Google App Engine einzupflegen.
Deshalb muss ich von SQL auf GQL wechseln. Meine ersten Versuche klappen soweit auch ganz gut.
Ich hab mal folgende Class / DB angelegt:
class board_topic_entry(db.Model):
title = db.StringProperty(required=True)
name = db.StringProperty(required=True)
message = db.TextProperty()
Das Eintragen & Auslesen klappt auch super.
Dann hab ich mir mal die Testeinträge im Datastore-Viewer angeguckt und habe gesehen, dass er mir meine drei Spalten (title, name, message) angelegt hat und noch zwei Spalten automatisch mit hinzugefügt hat: ID und Key
In der Spalte ID wird wie bei SQL einfach immer eine laufende ID vergeben.
Und genau darüber, wollte ich auch wieder gezielt löschen, also:
#...
q = db.GqlQuery("SELECT __key__ FROM board_topic_entry WHERE ID=20")
results = q.fetch(10)
db.delete(results)
return 'gelöscht'
Das funktioniert leider so nicht. (Hab die 20 mal nur so aus Test eingeben, aber es existiert ein Eintrag mit der ID 20)
Wenn ich nun aber z.B.
#...
q = db.GqlQuery("SELECT __key__ FROM board_topic_entry WHERE title='test123'")
results = q.fetch(10)
db.delete(results)
return 'gelöscht'
ausführe, klappt das.Also dann löscht er mir alle Einträge mit dem Titel "test123".
Aber wieso kann ich die ID-Spalte im Query-Befehl nicht ansprechen?
Beim Auslesen ist es mir schon übern Weg gelaufen, da konnte ich es auch nicht einfach mit "result.ID" (sowie bei den anderen: result.name, result.title etc.) aufrufen sondern musste es über "result.key().id()" machen.
Ich vermute fast, dass es irgendwie daran liegt, dass ich die Spalte nicht explizit in der Class deklariert habe ?!
Auf der anderen Seite denke ich mir, dass diese Spalte ja existiert und ich sie trotzdem ansprechen muss.
Bin für jeden Tipp dankbar.
MySQLer schrieb:
Achso, hier die Frage:
abby schrieb:
Dazu benötige ich doch die ID, aber wie kann ich mir die ID von den herausgefilterten Datensätzen anzeigen lassen?
So nun noch die Erklärung:
Das Statement zieht die ID aller Datensätze die sich in Bezug auf "Name" und "Destination" doppeln, oder allgemein > 1x vorkommen.
Ja, ich muss dir Recht geben, das war genau das, was ich gebraucht hab
Eigentlich ja total simpel, aber ich bin einfach nicht drauf gekommen...
Vielen Dank
Warum sollte ich, es gibt doch den Sourcecode. Dann kann man sich den ganzen Kram selbst kompilieren. Und genau das habe ich auch mit MySQL vor.... nur wie schon gesagt will MySQL nicht .... aber egal.
Mitlerweile habe ich mein Vorhaben aufgegeben und es dynamisch gelinkt. Statisch linken hat im Debug-modus nicht funktioniert (da die lib nur für Release war). Ich kann mich auch dunkel an eine debug-lib errinnern, ich bin mir aber nicht sicher ob die bei der Api dabei war... egal.
Normalerweise wird das SQL der View in das SQL der Anfrage eingemengt. Also wenn eine View existiert
CREATE VIEW myview AS SELECT * FROM mytable WHERE mycolumn > 100;
und die Anfrage dann
SELECT mycolumn FROM myView;
entsteht daraus intern
SELECT mycolumn FROM mytable WHERE mycolumn > 100;
Du kannst es hier für Mysql nachlesen: http://dev.mysql.com/doc/refman/5.5/en/view-algorithms.html
Ich würde an deiner Stelle erst einmal mit der View gehen, Zwischentabellen kannst du immer noch bauen wenn es zuviel werden sollte.
Hallo,
ich würde einfach in einer speziellen Tabelle die Versionsnummer der Datenbank speichern. So habe ich anhand der Programmhistorie auf Code-Ebene die erforderlichen Konvertierungsfunktionen für jede Version der Datenbank.
Z. B.
Init-Tabelle:
CREATE TABLE test1(id INT NOT NULL, name VARCHAR(255);
Änderung in Version 0.1 der Datenbank:
...
if dbVersionFromDB < dbVersionCurrent then begin
...
SQL.Add('ALTER TABLE test1 ADD COLUMN lastname');
...
end;
So ähnlich halt (ist aber ausschließlich pseudo-Code.
TyRoXx schrieb:
Ich habe es eben mit "sqlite-amalgamation-3-7-0-1" getestet und es funktioniert einwandfrei. Man muss nur "sqlite3.c" zum Projekt hinzufügen.
Hab es hin bekommen. Hatte vergessen sqlite3.h in den selben Ordner wie die Quelldatei zu verschieben.
Vielen DAnk
Ok, mein Problem war, dass in Tabelle1 die Eigenschaft2 mit NULL oder eben einem Fremdschlüssel angegeben werden konnte. Gab es dann eine Eigenschaft1 mit Eigenschaft2=NULL und zusätzlich mit Eigenschaft2=1, wurde lediglich der Eintrag mit Eigenschaft=1 angezeigt, sofern ich erst Eigenschaft2 ge-JOINt habe und dann Tabelle1 und zwei (was auch so bleiben soll). Ich habe nun den Aufbau der Eigenschaft2 geändert, sodass es für "NULL" auch einen Eintrag gibt...
Naja, hier und da tue ich schonmal was mit den Daten, aber im Prinzip schon.
Der Hintergrund ist, dass in die Spalte vordefinierte Werte eingetragen werden sollen und kein Freitext. Diese Werte sollen ebenfalls per Datenbank hinterlegt werden, um sie schnell zentral ändern zu können. Da ich also die zwei Tabellen sowieso anlege, bietet sich auch die Verknüpfung an, um Redundanzen gering zu halten...
Das ist natürlich klar es geht mir ja auch nicht darum dass sie keine brauchen sollten. Wenn es dafür Vorteile hat.
Mit SQL Compact habe ich noch nie ein Projekt für die Öffentlichkeit gemacht, allerdings habe ich mal einen Installer mit den DLLs gemacht und das ging nicht. Nicht dass es so schlimm wäre, ist sicher nicht schwer zum laufen zu kriegen aber wenn es doch einfacher geht (mit heutzutage bereits integriertem Access), was bringt SQL CE denn für Vorteile?
Kommt drauf an wie das ganze suchbar sein soll.
Rein der Lookup Datensatz-ID -> Spektrum wird sicher massiv viel schneller, wenn du das ganze Spektrum in einen String formatierst und den in ein varchar Feld packst.
Wenn du flexible Abfragen unterstützen willst, dann mach die Variante mit ner Detail-Tabelle.
Hallo,
ich habe die C++ SDK für MySQL eingebunden und kann auch schon recht lustig Texte und Daten ändern. Dazu mache ich eine Tabelle mit int,int,BLOB.
Nun meine Frage, ich will gerne im BLOB eine Datei ablegen, diese ist binär, also mit vielen nullen und Sonderzeichen.
Ich mache also einen insert mit 1,2,'' und muss dann wohl den Inhalt des Blobs ändern und SQL irgendwie sagen das es Datei xy nehmen muss.
Leider finde ich dazu nicht genügend Infos, meist PHP.
Hat hier jemand einen geprüften Schnipsel C++/mySQL Syntax, der mir das mal genauer verdeutlicht?
Grüße
TheNoName
Hallo zusammen,
ich möchte gerne eine Software schreiben ohne einen Datenbankserver. Deshalb habe ich mich jetzt etwas mit Firebird embedded auseinander gesetzt.
Hierzu habe ich noch ein paar Fragen, da es bei mir nicht ganz so funktioniert.
Ich habe mich an folgende Anleitung gehalten:
http://www.mseegernet.de/Delphi/FBEmbedded/FBEmbedded.htm
Jetzt meine Fragen. Muss ich den Server bei mir installieren um eine neue Datenbank zu erstellen oder reicht es einfach die dll-Dateien (fbclient.dll oder gds32.dll) in ein Verzeichnis zu kopieren. So wie ich das verstanden habe, emulieren diese Datei ja den Server, oder?
Ich kann unter der IBOConsole aber nur auf den lokalen Server zugreifen, wenn ich den Firebirdserver installiert habe. Nur mit den DLL-Dateien funktioniert das leider nicht. Kann mir hier jemand weiterhelfen?
Danke und Gruß
Wenn du immer in dem Textfeld suchen mußt kannst du doch darüber auch ein Index legen. Selektiv sollte er ja wohl sein wenn die Werte tatsächlich eindeutig sind.