In SELECT 2 Tabellen Ausführen
-
Hallo,
Wie kann man in einer SELECT Anweisung 2 Tabellen auslesen?
Habe ADOConnection1 und ADOQuery1 drauf die Datenbank ist MS-Access 2002.Code Beispiel
SELECT * FROM OWN WHERE Revolver=:Revolver SELECT * FROM DINISO WHERE Revolver=:Revolver
Die Beiden in einer SELECT Anweisung.
Wen ich
"SELECT * FROM OWN INNER JOIN DINISO ON OWN.Revolver = DINISO.Revolver WHERE OWN.Revolver=:Revolver AND DINISO.Revolver=:Revolver";
mache, gibt keine Fehler Meldung aber ist leer
-
Probiere mal den folgenden Select aus:
SELECT o.*, d.* FROM OWN o INNER JOIN DINISO d ON o.Revolver = d.Revolver WHERE o.Revolver = :Revolver
-
Hi,
läuft zwar aber er liest nur die OWN Tabelle aus.
ich weiss jetzt nicht wie das läuft mit der Ausgabe?
meiner istwhile (!ADOQuery->Eof) { ... ADOQuery->FieldByName("CodeHeader")->AsString; <-- Der geht nicht sagt CodeHeader nicht gefunden ADOQuery->FieldByName("o.CodeHeader")->AsString; <-- Der geht nur halt die OWN Tabelle ADOQuery->FieldByName("d.CodeHeader")->AsString <-- Der geht auch macht aber die Anzahl der Schleife von OWN Tabelle aber mit dem Inhalt von DINISO
-
Rave173 schrieb:
...
Um sinnvolle Antworten zu bekommen, solltest du vielleicht überhaupt einmal erklären was du erreichen willst. Und vielleicht ist auch erst einmal zu klären wie viel du überhaupt von dem Prinzip einer relationalen Datenbank und Joins verstehst.
Grundsätzlich habe ich dir genau die Antwort gegeben, nach der du gefragt hast. Nur hast du deine Frage vielleicht nicht so gut gestellt das man dir die Antwort die du erwartet hattest geben kann.
Und natürlich kann eine Abfrage eines Feldes, das in 2 Tabellen enthalten ist nicht mit einem Namen erfolgen, wenn der Mehrdeutig ist. Ebenso wie die Tabellen bezogenen Felder auch nur immer den Inhalt eben jenes Feldes liefern. Und ein Inner Join liefert pro gejointen Wert nun einmal n*m Ergebnisse (wobei n und m immer der Anzahl der Datensätze entspricht, die zu dem gewählten Kriterium in der jeweiligen Jointabelle passen).
Und wenn in der einen Tabelle (o) 1 Wert zum Join passt und in der Anderen (d) 4 dann sieht das wie folgt aus:
o.CodeHeader d.CodeHeader
<1 Wert o> <1 Wert d>
<1 Wert o> <2 Wert d>
<1 Wert o> Wert d>
<1 Wert o> <4 Wert d>Weil ein Join nun einmal die Inhalte beider Tabellen miteinander kombiniert.
Mir ist nicht bewusst was du wirklich willst (Davon abgesehen das die Informationsmenge die du uns gibst auch extrem gering ist. Ich kenne weder die Tabellen noch deren Felder).
-
Hi asc,
ja Sorry mit der Information und ich kenne mich nicht damit aus
Aber ich habe gerade noch ein bisschen rum getüftelt und es klappt
ADOQuery->SQL->Add("SELECT CodeHeader, CodeText, Index FROM OWN WHERE Maschine=:Maschine"); ADOQuery->SQL->Add("UNION"); ADOQuery->SQL->Add("SELECT CodeHeader, CodeText, Index FROM DINISO WHERE Revolver=:Revolver"); ADOQuery->SQL->Add("ORDER BY Index ASC"); ADOQuery->Parameters->ParamByName("Maschine")->Value = Child->sMaschine; ADOQuery->Parameters->ParamByName("Revolver")->Value = Child->sRevolver;
So wie das gerade läuft so möchte ich das haben. Er listet beide Tabellen auf
-
Hmm
Da gibt's ein Problem mit dem Code
ADOQuery->SQL->Add("SELECT CodeHeader, CodeText, Index FROM OWN WHERE Maschine=:Maschine AND Revolver=:Revolver"); ADOQuery->SQL->Add("UNION ALL"); ADOQuery->SQL->Add("SELECT CodeHeader, CodeText, Index FROM DINISO WHERE Revolver=:Revolver OR Revolver IS NULL"); ADOQuery->SQL->Add("ORDER BY Index ASC");
Sobald ich Revolver in beiden Tabellen habe liest er mir die andere Tabelle
nicht ein. Aber ich möchte das so ungefähr haben. Das ich 2 SELECT habe mit
unterschiedliche Anweisungen (siehe Oben). Aber in einer Ausführung damit ich das dann Sortieren und auflisten kann.Ich hoffe die Information ist jetzt besser?
-
Rave173 schrieb:
Ich hoffe die Information ist jetzt besser?
Nein. Den grundsätzlich müssten beide Tabellen (sofern die jeweiligen Where-Klauseln zutreffen) auch Treffer liefern. Hier fehlt einiges wesentliches an Informationen.
-
ja hmmm
Ich weiß nicht welche?!?
Wen ich die SELECT Anweisung einzeln laufe lasse, die funktionieren.
Nur ich möchte ja beide laufen lassen.
Sowie ich gelesen habe ist bei den Befehl 'UNION' so, das er ein Doppelten nicht mit Anzeigt. Sowie bei mir wen ich den 'Revolver...' Befehl in beide 'WHERE' Anweisung einfüge.
-
Rave173 schrieb:
Wen ich die SELECT Anweisung einzeln laufe lasse, die funktionieren.
Exakt so wie bei obigen "UNION ALL", sprich einmal:
SELECT CodeHeader, CodeText, Index FROM OWN WHERE Maschine=:Maschine AND Revolver=:Revolver
und einmal
SELECT CodeHeader, CodeText, Index FROM DINISO WHERE Revolver=:Revolver OR Revolver IS NULL
ergibt bei dir in Summe mehr als
SELECT CodeHeader, CodeText, Index FROM OWN WHERE Maschine=:Maschine AND Revolver=:Revolver UNION ALL SELECT CodeHeader, CodeText, Index FROM DINISO WHERE Revolver=:Revolver OR Revolver IS NULL
Das dürfte eigentlich nicht sein.
Rave173 schrieb:
Sowie ich gelesen habe ist bei den Befehl 'UNION' so, das er ein Doppelten nicht mit Anzeigt.
Bei UNION werden Duplikate entfernt, bei UNION ALL nicht.
-
asc schrieb:
Bei UNION werden Duplikate entfernt, bei UNION ALL nicht.
Ob ich jetzt 'UNION' oder 'UNION ALL' schreibe, das bleibt gleich.
Er liest nurSELECT CodeHeader, CodeText, Index FROM OWN WHERE Maschine=:Maschine AND Revolver=:Revolver
aus
-
Rave173 schrieb:
asc schrieb:
Bei UNION werden Duplikate entfernt, bei UNION ALL nicht.
Ob ich jetzt 'UNION' oder 'UNION ALL' schreibe, das bleibt gleich.
Er liest nurSELECT CodeHeader, CodeText, Index FROM OWN WHERE Maschine=:Maschine AND Revolver=:Revolver
aus
- Alle drei Varianten einzeln ausgeführt (exakt so wie oben geschrieben) liefern aber Treffer?
- Wen ja, macht es einen Unterschied ob du statt "ADOQuery->SQL->Add" mit Einzelteilen, dies als einen Gesamtstring (Leerzeichen zwischen den SQL-Teilen nicht vergessen) setzt?
Grundsätzlich macht UNION und UNION ALL definitiv etwas anderes, ich tippe aber vielmehr darauf das du entweder etwas entscheidendes nicht mitteilst oder (wovon ich nicht ausgehe) die Komponenten einen Fehler haben. Eine weitere Variante ist noch die Parameter unterschiedlich zu nennen (Wir hatten Komponenten die bei gleichen Parameternamen immer nur den ersten setzten).
P.S: Falls die E-Mail-Funktion des Forums aktiv sein sollte, prüfe mal ob du etwas erhalten hast.
-
Erst mal Danke für Deine Mühe
In Moment funktioniert es und es lag an den Parameter ich habe den 2. Revolver ein neuen Parameter zugewiesen und es klappt