Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi SQL ADS und ungleich (https://www.delphipraxis.net/123457-sql-ads-und-ungleich.html)

Grolle 2. Nov 2008 14:02

Datenbank: ADS local • Version: 9 • Zugriff über: ADS

SQL ADS und ungleich
 
Hallo,

ich habe ein Problem mit einer SQL-Query:
SQL-Code:
SELECT * FROM CONTACTS LEFT JOIN PROJECTS_TO_CONTACTS ON CONTACTS.ID = PROJECTS_TO_CONTACTS.CONTACT_ID
WHERE PROJECTS_TO_CONTACTS.PROJECT_ID=4
diese funktioniert wie Sie soll!
SQL-Code:
SELECT * FROM CONTACTS LEFT JOIN PROJECTS_TO_CONTACTS ON CONTACTS.ID = PROJECTS_TO_CONTACTS.CONTACT_ID
WHERE PROJECTS_TO_CONTACTS.PROJECT_ID<>4
Hier werden keine Datensätze angezeigt. Eigentlich sollten hier alle ankommen, welche mit der obigen Query
nicht ausgespuckt werden.

Viele Grüße ...

mkinzler 2. Nov 2008 14:06

Re: SQL ADS und ungleich
 
Versuch mal
SQL-Code:
SELECT * FROM CONTACTS LEFT JOIN PROJECTS_TO_CONTACTS ON CONTACTS.ID = PROJECTS_TO_CONTACTS.CONTACT_ID
WHERE not PROJECTS_TO_CONTACTS.PROJECT_ID=4

Grolle 2. Nov 2008 14:09

Re: SQL ADS und ungleich
 
Hi,

kommt auch nix :?

Viele Grüße ...

mkinzler 2. Nov 2008 14:11

Re: SQL ADS und ungleich
 
Es könnte auch am LEFT JOIN liegen und der Tatsache, das du nach der rechten Tabelle filterst.
Filtere mal nach der CONTACTS.ID

Grolle 2. Nov 2008 14:22

Re: SQL ADS und ungleich
 
Hi,

ok das funktioniert, aber wie bekomme ich denn jetzt die Filterung nach PROJECTS_TO_CONTACTS.PROJECT_ID<>4.
Unterabfrage?

Viele Grüße ....

mkinzler 2. Nov 2008 14:25

Re: SQL ADS und ungleich
 
Da diese wegen der Join Bedingung identisch mit CONTACTS.ID ist kannst du diese in der WHERE-Clause durch CONTACTS.ID ersetzen

Grolle 2. Nov 2008 14:35

Re: SQL ADS und ungleich
 
Hi,

aber die Join Bedingung bezieht sich doch auf ein anderes Feld?!?

Viele Grüße ...

mkinzler 2. Nov 2008 14:40

Re: SQL ADS und ungleich
 
Uch, da hab ich mich verguckt. :oops:
Es gibt solche Datensätze aber?

Grolle 2. Nov 2008 15:33

Re: SQL ADS und ungleich
 
Hi,

ja gibt es :zwinker:

Viele Grüße

alzaimar 2. Nov 2008 16:37

Re: SQL ADS und ungleich
 
Prüf mal, welche CONTACT_ID die Datensätze mit PROJECT_ID <> 4 haben, oder ersetze das 'LEFT JOIN' durch ein 'FULL JOIN'. Dann siehst Du, woran es hapert. Und wenn Du nix siehst, ist ADS für den A****.

Grolle 2. Nov 2008 16:49

Re: SQL ADS und ungleich
 
Hi,

wenn ich FULL JOIN benutze werden die Datensätze auch nicht ausgegeben. :cry:
Die CONTACT_ID's sind auch ok.

Viele Grüße ...

mkinzler 2. Nov 2008 16:54

Re: SQL ADS und ungleich
 
Versuch mal
SQL-Code:
SELECT * from ( SELECT * FROM CONTACTS LEFT JOIN PROJECTS_TO_CONTACTS ON CONTACTS.ID = PROJECTS_TO_CONTACTS.CONTACT_ID)
 WHERE not PROJECT_ID=4;

Grolle 2. Nov 2008 16:59

Re: SQL ADS und ungleich
 
Hi,

funktioniert auch nicht ..

Viele Grüße ...

// Ich glaube er hat ein Problem mit leeren Werten?! :wall:

Michael Habbe 2. Nov 2008 17:08

Re: SQL ADS und ungleich
 
Hi,

kannst Du mal ein paar Datensätze als Anhang bereitstellen?
Ich arbeite nun schon seit Jahren mit ADS, aber in Puncto SQL ist das immer noch nicht so richtig das Wahre :roll:


Ich erinner mich, dass ich das gleiche Problem auch schon hatte, kann aber im Moment nicht mehr sagen, wie ich es umschifft habe.


Michael



edit:

Diese dämlichen Datensätze mit Null-Werten werden immer weggelassen, da musst Du mit IFNULL(feld, ersatz) arbeiten. Siehe HILFEEEE

Grolle 2. Nov 2008 17:11

Re: SQL ADS und ungleich
 
Hi,

funzt jetzt. Ich habe nicht bedacht/beachtet/gewußt, dass ich die noch nicht ausgefüllten Felder (NULL)
extra mit abfragen muss.

Vielen Dank und viele Grüße ....

alzaimar 2. Nov 2008 17:31

Re: SQL ADS und ungleich
 
Zitat:

Zitat von alzaimar
Und wenn Du nix siehst, ist ADS für den A****.

q.e.d. Was ist das bloß für ein Schrottprodukt?

Grolle 2. Nov 2008 17:46

Re: SQL ADS und ungleich
 
Hi,

jetzt habe ich eine Sache noch nicht bedacht. Kontakte die die PROJECT_ID 4 haben, können auch weitere
PROJECT_ID's haben. Diese werden aber mit der Query auch ausgegeben (sollen Sie aber nicht).
SQL-Code:
SELECT * FROM CONTACTS LEFT JOIN PROJECTS_TO_CONTACTS ON CONTACTS.ID = PROJECTS_TO_CONTACTS.CONTACT_ID
WHERE ((PROJECTS_TO_CONTACTS.PROJECT_ID<>4) or (PROJECTS_TO_CONTACTS.PROJECT_ID is null))
Wie löse ich das denn?

joachimd 3. Nov 2008 08:40

Re: SQL ADS und ungleich
 
Zitat:

Zitat von alzaimar
Zitat:

Zitat von alzaimar
Und wenn Du nix siehst, ist ADS für den A****.

q.e.d. Was ist das bloß für ein Schrottprodukt?

Eines, das sich genau in diesem Punkt an den SQL ANSI Standard hält!

joachimd 3. Nov 2008 08:42

Re: SQL ADS und ungleich
 
Zitat:

Zitat von Grolle
Hi,

jetzt habe ich eine Sache noch nicht bedacht. Kontakte die die PROJECT_ID 4 haben, können auch weitere
PROJECT_ID's haben. Diese werden aber mit der Query auch ausgegeben (sollen Sie aber nicht).
SQL-Code:
SELECT * FROM CONTACTS LEFT JOIN PROJECTS_TO_CONTACTS ON CONTACTS.ID = PROJECTS_TO_CONTACTS.CONTACT_ID
WHERE ((PROJECTS_TO_CONTACTS.PROJECT_ID<>4) or (PROJECTS_TO_CONTACTS.PROJECT_ID is null))
Wie löse ich das denn?

Poste bitte mal die (Minimal-) Tabellenstruktur sowie ein paar Datensätze zusammen mit dem erwarteten Ergebnis.

Grolle 3. Nov 2008 10:56

Re: SQL ADS und ungleich
 
Hallo,

CONTACTS

id | name | first_name
--------------------------
1 | Muster | Stefan
2 | Test | Andrea
3 | Beispiel | Carsten
4 | Exemplar | Heidi

PROJECTS_TO_CONTACTS

id | contact_id | project_id
----------------------------
1 | 2 | 4
2 | 1 | 7
3 | 3 | 4
4 | 2 | 7
5 | 4 | 4

dann gibts noch eine PROJECTS-Tabelle, hier aber nicht relevant.

Mit der ersten Abfrage hole ich alle CONTACTS, die z. B. dem PROJECT 4 zugeordnet sind:
SQL-Code:
SELECT * FROM CONTACTS LEFT JOIN PROJECTS_TO_CONTACTS ON CONTACTS.ID = PROJECTS_TO_CONTACTS.CONTACT_ID
WHERE PROJECTS_TO_CONTACTS.PROJECT_ID=4
Jetzt möchte ich alle CONTACTS, die nicht dem PROJECT 4 zugeordnet sind, oder 0 sind und auch nicht in dem
Ergebnis der ersten Abfrage auftauchen (das passiert in den obigen Tabellen z. B. mit CONTACT_ID 2. Dieser
ist mehreren Projekten zugeordnet). Bisher sieht die Abfrage da so aus:
SQL-Code:
SELECT * FROM CONTACTS LEFT JOIN PROJECTS_TO_CONTACTS ON CONTACTS.ID = PROJECTS_TO_CONTACTS.CONTACT_ID
WHERE ((PROJECTS_TO_CONTACTS.PROJECT_ID<>4) OR (PROJECTS_TO_CONTACTS.PROJECT_ID IS NULL))
Ich hoffe das war einigermaßen verständlich :?

Viele Grüße ...

nahpets 3. Nov 2008 11:24

Re: SQL ADS und ungleich
 
Zitat:

Zitat von Grolle
SQL-Code:
SELECT * FROM CONTACTS LEFT JOIN PROJECTS_TO_CONTACTS ON CONTACTS.ID = PROJECTS_TO_CONTACTS.CONTACT_ID
WHERE ((PROJECTS_TO_CONTACTS.PROJECT_ID<>4) OR (PROJECTS_TO_CONTACTS.PROJECT_ID IS NULL))

Versuchmal dieses:
SQL-Code:
SELECT * FROM CONTACTS LEFT JOIN PROJECTS_TO_CONTACTS ON CONTACTS.ID = PROJECTS_TO_CONTACTS.CONTACT_ID
WHERE ((not (PROJECTS_TO_CONTACTS.PROJECT_ID=4)) OR (PROJECTS_TO_CONTACTS.PROJECT_ID IS NULL))
oder:
SQL-Code:
SELECT * FROM CONTACTS LEFT JOIN PROJECTS_TO_CONTACTS ON CONTACTS.ID = PROJECTS_TO_CONTACTS.CONTACT_ID
WHERE ((PROJECTS_TO_CONTACTS.PROJECT_ID not in(4)) OR (PROJECTS_TO_CONTACTS.PROJECT_ID IS NULL))
Der Vergleich auf <> funktioniert bei einigen Datenbanken nicht ordentlich, wenn von ihm auch Spalten mit Null-Werten betroffen sind.
Hast Du bei Deiner Datenbank eine IsNull- oder IfNull-Funktion? Dann könnte Dir auch sowas helfen:
SQL-Code:
SELECT * FROM CONTACTS LEFT JOIN PROJECTS_TO_CONTACTS ON CONTACTS.ID = PROJECTS_TO_CONTACTS.CONTACT_ID
WHERE ((IsNull(PROJECTS_TO_CONTACTS.PROJECT_ID,-1) <> 4))
Hoffe, dass ich Dein Problem verstanden habe und nicht jetzt den Lösungsansatz für ein anderes Problem liefere.

gmc616 3. Nov 2008 11:46

Re: SQL ADS und ungleich
 
Nur so als Idee:
Warum setzt du nicht PROJECT_ID auf default not null bzw. default -1 ?

:hi:

Grolle 3. Nov 2008 12:06

Re: SQL ADS und ungleich
 
Hallo,

ich zitier mich mal:

Zitat:

Zitat von Grolle
Jetzt möchte ich alle CONTACTS, die nicht dem PROJECT 4 zugeordnet sind, oder 0 sind und auch nicht in dem
Ergebnis der ersten Abfrage auftauchen (das passiert in den obigen Tabellen z. B. mit CONTACT_ID 2. Dieser
ist mehreren Projekten zugeordnet).
Bisher sieht die Abfrage da so aus:
SQL-Code:
SELECT * FROM CONTACTS LEFT JOIN PROJECTS_TO_CONTACTS ON CONTACTS.ID = PROJECTS_TO_CONTACTS.CONTACT_ID
WHERE ((PROJECTS_TO_CONTACTS.PROJECT_ID<>4) OR (PROJECTS_TO_CONTACTS.PROJECT_ID IS NULL))

Nur der im Zitat fett markierte Teil funktioniert nicht!. Ansonsten funktioniert die Abfrage einwandfrei!

Viele Grüße ...

joachimd 3. Nov 2008 12:31

Re: SQL ADS und ungleich
 
Zitat:

Zitat von Grolle
Jetzt möchte ich alle CONTACTS, die nicht dem PROJECT 4 zugeordnet sind, oder 0 sind und auch nicht in dem
Ergebnis der ersten Abfrage auftauchen (das passiert in den obigen Tabellen z. B. mit CONTACT_ID 2. Dieser
ist mehreren Projekten zugeordnet).

SQL-Code:
select a.* from #contacts a
where a.id not in (select b.contact_id from #projects_to_contacts b where b.project_id=4 )

Grolle 3. Nov 2008 15:38

Re: SQL ADS und ungleich
 
Hallo Joachim,

ich bekommme da eine Fehlermeldung, das er die Tabelle nicht findet?:
Zitat:

poQuery: Error 7200: AQE Error: State = HY000; NativeError = 7112; [iAnywhere Solutions][Advantage SQL][ASA] Error 7112: The temporary table cannot be found. Table name: #contacts
Viele Grüße ...

// Edit. Ich glaub so geht's:
SQL-Code:
select a.* from contacts as a
where a.id not in (select b.contact_id from projects_to_contacts as b where b.project_id=4 )

Union 3. Nov 2008 18:59

Re: SQL ADS und ungleich
 
Er hat wahrscheinlich die Testdaten in temporären Tabellen angelegt (Präfix #). ADS löscht solche Tabellen beim Schließen der DB-Connection automatisch.

Grolle 3. Nov 2008 19:45

Re: SQL ADS und ungleich
 
Hi,

Zitat:

Zitat von Union
Er hat wahrscheinlich die Testdaten in temporären Tabellen angelegt (Präfix #). ADS löscht solche Tabellen beim Schließen der DB-Connection automatisch.

wieder was gelernt. Auf jeden Fall klappt's jetzt. Danke euch allen!

:cheer: :dp: :cheer:


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:18 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