Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Frage zu SQL Komma-Join (https://www.delphipraxis.net/134142-frage-zu-sql-komma-join.html)

Grolle 16. Mai 2009 15:25

Datenbank: Firebird • Version: 2.1 • Zugriff über: IBDAC

Frage zu SQL Komma-Join
 
Hi,
SQL-Code:
select n.*, c.* FROM notes as n, correspondence as c WHERE (n.recipient=22) or (c.contact_id=22)
Warum liefert WHERE hier komplett falsche Ergebnisse?

Viele Grüße ...

Dax 16. Mai 2009 15:31

Re: Frage zu SQL Komma-Join
 
Weil das Eis zu kalt ist ;)

Ich nehme an, du willst die Tabellen zusammenfassen, sodass in allen Zeilen n.recipient = c.contact_id = 22 ist? Dann musst du das auch so hinschreiben ;)

Grolle 16. Mai 2009 15:35

Re: Frage zu SQL Komma-Join
 
Hi,

nein ich will es so haben wie es da steht. Quasi das:
SQL-Code:
SELECT * FROM NOTES WHERE recipient=22
SELECT * FROM CORRESPONDENCE WHERE contact_id=22
zusammen in einer Tabelle.

Viele Grüße ....

Dax 16. Mai 2009 15:39

Re: Frage zu SQL Komma-Join
 
Untereinander? Dann musst du sicherstellen, dass beide irgendwie gleich benannte Spalten haben (oder das über Projektionen erzeugen) und die beiden Queries per UNION aneinaderkleben. Wenn du es nebeneinander willst, musst du die Tabellen FULL OUTER JOINen mit Bedingung False, dann funktionert es. Das Komma erzeugt ja gerade das Kartesische Produkt, also kriegst du mit der Abfrage oben auf der linken/rechten Seite jeweils mindestens ein Mal die komplette Tabelle.

omata 16. Mai 2009 15:41

Re: Frage zu SQL Komma-Join
 
So wie du es formuliert hast, wird aber jetzt jede Zeile der einen Tabelle mit jeder Zeile der anderen Tabelle in Beziehung gesetzt. Du musst noch zusätzlich eine Regel vorgeben, die eben dafür sorgt, dass nur die Zeilen miteinander verbunden werden, die auch etwas miteinander zutun haben. Welche Spalten der beiden Tabellen stehen denn in Beziehung zueinander?

Oder eben so...
SQL-Code:
select n.*, c.* 
FROM notes as n, correspondence as c
WHERE n.recipient = c.contact_id
  AND n.recipient = 22
oder gleich ordentlich...
SQL-Code:
select n.*, c.* 
FROM notes as n
INNER JOIN correspondence as c
  ON n.recipient = c.contact_id
WHERE n.recipient = 22

Grolle 16. Mai 2009 15:43

Re: Frage zu SQL Komma-Join
 
Zitat:

Zitat von omata
Welche Spalten der beiden Tabellen stehen denn in Beziehung zueinander?

Keine :stupid:

omata 16. Mai 2009 17:00

Re: Frage zu SQL Komma-Join
 
Zitat:

Zitat von Grolle
Zitat:

Zitat von omata
Welche Spalten der beiden Tabellen stehen denn in Beziehung zueinander?

Keine :stupid:

Hast du mal mein Edit oben ausprobiert?

Wie willst du die Zeilen zusammenführen?

In Spaltenform...
SQL-Code:
SELECT n.*, c.*
FROM notes n
LEFT JOIN correspondence c
  ON c.contact_id = 22
WHERE n.recipient = 22
In Zeilenform...
SQL-Code:
SELECT n.*, c.*
FROM correspondence c
LEFT JOIN (SELECT FIRST 0 * FROM notes) n
  ON 1 = 1
WHERE c.contact_id = 22
UNION
SELECT n.*, c.*
FROM notes n
LEFT JOIN (SELECT First 0 * FROM correspondence) c
  ON 1 = 1
WHERE n.recipient = 22

Grolle 16. Mai 2009 17:14

Re: Frage zu SQL Komma-Join
 
Hi omata,
Zitat:

Zitat von omata

Hast du mal mein Edit oben ausprobiert?

Habe ich jetzt erst gelesen :oops:
Zitat:

Zitat von omata
Wie willst du die Zeilen zusammenführen?
In Zeilenform...
SQL-Code:
SELECT n.*, c.*
FROM correspondence c
LEFT JOIN (SELECT FIRST 0 * FROM notes) n
  ON 1 = 1
WHERE c.contact_id = 22
UNION
SELECT n.*, c.*
FROM notes n
LEFT JOIN (SELECT First 0 * FROM correspondence) c
  ON 1 = 1
WHERE n.recipient = 22

Das ist es :cheer:

Grolle 17. Mai 2009 11:43

Re: Frage zu SQL Komma-Join
 
Hallo,

an welche Stelle muss (kann) ich denn jetzt noch ein ORDER BY packen (in beiden Tabellen ist ein Datumsfeld wonach ich sortieren will)?

Viele Grüße ...

mkinzler 17. Mai 2009 11:52

Re: Frage zu SQL Komma-Join
 
Das gesamte Ergebnis oder die einzelnen Teile?

DeddyH 17. Mai 2009 11:54

Re: Frage zu SQL Komma-Join
 
Vergib bei der UNION am Besten für beide Datumsfelder denselben Alias, dann kannst Du am Schluss nach diesem sortieren.

Grolle 17. Mai 2009 11:55

Re: Frage zu SQL Komma-Join
 
Zitat:

Zitat von mkinzler
Das gesamte Ergebnis oder die einzelnen Teile?

Das gesamte Ergebnis!

mkinzler 17. Mai 2009 11:57

Re: Frage zu SQL Komma-Join
 
Zitat:

Zitat von Grolle
Zitat:

Zitat von mkinzler
Das gesamte Ergebnis oder die einzelnen Teile?

Das gesamte Ergebnis!

Dann siehe Detlefs Antwort.

Grolle 17. Mai 2009 12:34

Re: Frage zu SQL Komma-Join
 
SQL-Code:
SELECT n.recipient,n.start_date, c.contact_id, c.send_date
FROM correspondence c
LEFT JOIN (SELECT FIRST 0 * FROM notes) n
  ON 1 = 1
WHERE c.contact_id = 22
UNION
SELECT n.recipient,n.start_date as sortdate, c.contact_id, c.send_date as sortdate
FROM notes n
LEFT JOIN (SELECT First 0 * FROM correspondence) c
  ON 1 = 1
WHERE n.recipient = 22 order by sortdate
Das mag er aber nicht. Wo ist denn da der Fehler :gruebel:

mkinzler 17. Mai 2009 12:38

Re: Frage zu SQL Komma-Join
 
Im ersten Satement fehlt der Alias im 2. ist er dafür doppelt

TBx 17. Mai 2009 12:54

Re: Frage zu SQL Komma-Join
 
Wenn ich Dich nun richtig verstanden habe, möchtest Du eine Ergebnismenge mit ID und Datum erhalten.
Die ID ist entweder die CONTACT_ID oder die RERIPIENT_ID, das Datum analog dazu SEND_DATE bzw. START_DATE.

Dazu verwendest Du einen klassischen UNION:

SQL-Code:
SELECT c.contact_id, c.send_date
  FROM correspondence c
  WHERE c.contact_id = 22
UNION
SELECT n.recipient, n.start_date
  FROM notes n
  WHERE n.recipient = 22 
order by 2
Das Order by 2 bewirkt die Sortierung nach dem Datum.
Doppelte Datensätze werden hier ausgefiltert, solltest Du diese benötigen, so verwende FULL JOIN.


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:07 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz