AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

SQL "umbauen"

Ein Thema von Salomon · begonnen am 3. Mär 2008 · letzter Beitrag vom 30. Apr 2008
Antwort Antwort
Seite 3 von 3     123   
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#21

Re: SQL "umbauen"

  Alt 30. Apr 2008, 12:43
Erstmal ist es eine gute Idee, sich ein Buch zu besorgen. Ich habe 'Inside SQL xxxxx' (xxxxx = Versionsnummer vom MSSQL) von Kalen Delaney (MS Press). Das arbeitest Du durch und dann stellst Du keine Fragen mehr

Nimm Dir einfach die innere Query (die, die zählt) und ersetze das 'Count(*)' durch ein '*'. Dann siehst du, was alles gezählt werden WÜRDE. Ich mache es so:
1. Nur die Einschränkung auf ein Team
2. Dann zusätzlich die Einschränkung auf den Zeitraum (oder beides gleich)
3. Gibt es Einträge mit 'visibility = NULL'? Willst Du die mitzählen?
usw.

Ich verfeinere also die Abfrage, bis sie passt und versuche dabei, Sonderfälle gleich mit einzubauen. Das geht am Besten, in dem ich einen großen Zeitraum wähle.

Die Geschichte mit dem LEFT, RIGHT und FULL JOIN (oder ganz ohne) lässt sich einfach so erklären:

Zwei Tabellen: Paare und Kinder. Es gibt kinderlose Paare, Paare mit Kindern und Waisenkinder.

1. Alle Paare und, falls sie Kinder haben, auch Diese: Paare LEFT JOIN Kinder
2. Nur Paare mit Kindern: Paare JOIN Kinder
3. Alle Kinder, und falls sie Eltern haben, auch Diese: Paare RIGHT JOIN Kinder
4. Nur Paare ohne Kinder: Paare LEFT JOIN Kinder WHERE Kinder.Kind IS NULL
5. Nur Waisenkinder: Paare RIGHT JOIN Kinder WHERE Paare.Paar IS NULL

(Die ON - Klausel (Paare JOIN Kinder ON Paar.paarID = Kinder.paarID) habe ich weggelassen.
Anmerkungen:
A LEFT JOIN B ist das Gleiche wie B RIGHT JOIN A
(2) kann man auch so ausdrücken: Paare LEFT JOIN Kinder WHERE Kinder.Kind is not null. Auf Deutsch bedeutet das:
"Alle Paare, und falls sie Kinder haben, auch Diese WOBEI es ein Kind geben muss"


Ach, nochwas:

Die ON-Klausel dient zur logischen Verknüpfung der Tabellen und NICHT zum Filtern, das macht man in der WHERE-Klausel.
Es gibt aber auch Filter, die auch eine logische Verknüpfung sind, also ist da die Trennung nicht so klar.


Und nochwas:
JOINs über zwei Tabellen sind einfach, ab drei wirds dann haarig, daher ist es wichtig, möglichst nur in der WHERE-Klausel zu filtern.
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
Benutzerbild von Salomon
Salomon

Registriert seit: 9. Jun 2002
453 Beiträge
 
#22

Re: SQL "umbauen"

  Alt 30. Apr 2008, 13:48
Ich habe mir das Buch "Einstieg in SQL" bestellt. http://www.amazon.de/exec/obidos/ASIN/3898424979/delphipraxis-21 Ich denke das bietet einen guten Einstieg.

Vielleicht solltest du auch ein Buch schreiben, deine Erklärungen kann man auf jedenfall gut nachvollziehen

Das langsame herrantasten an den kompletten SQL String funktioniert ganz gut. Da merkt man schnell das ich viele der NULL-Abfragen nicht brauche.
01001000 01100001 01101100 01101100 01101111
01010111 01100101 01101100 01110100 00100001

http://www.it-adviser.net
  Mit Zitat antworten Zitat
Benutzerbild von Olli73
Olli73

Registriert seit: 25. Apr 2008
Ort: Neunkirchen
662 Beiträge
 
#23

Re: SQL "umbauen"

  Alt 30. Apr 2008, 18:19
Zitat:
du schummelst
im Original stand ein full-join, und darauf bezog sich meine Anmerkung.
@NormanNG:

Im Beispiel habe ich zwar left join verwendet, weil full join m.E. u.U. auch unerwünschte Daten bringt, aber es ging ja darum, dass nicht alle Teams aufgelistet wurden; bei meiner Abfrage aber kommen alle Teams vor:

SQL-Code:
create table TEST1 (TEAM varchar(10));
create table TEST2 (TEAM varchar(10), DATUM datetime);

insert into TEST1 values ('TeamA');
insert into TEST1 values ('TeamB');
insert into TEST1 values ('TeamC');

insert into TEST2 values ('TeamA', '29.04.2008');
insert into TEST2 values ('TeamB', '30.04.2008');
insert into TEST2 values (null, '29.04.2008');
insert into TEST2 values (null, '30.04.2008');


mit "where" fehlt TeamA komplett:

select a.TEAM, b.DATUM from TEST1 a full join TEST2 b on b.team = a.team
where (b.DATUM = '30.04.2008or b.DATUM is null) order by 1, 2

<NULL> 30.04.2008
TeamB 30.04.2008
TeamC <NULL>

bei der Bedingung im Join erscheinen alle Teams und ggf. noch ein paar
unnötige Datumswerte mit Team "NULL" (welche bei left join fehlen würden):

select a.TEAM, b.DATUM from TEST1 a full join TEST2 b on b.team = a.team
and (b.DATUM = '30.04.2008') order by 1, 2

<NULL> 29.04.2008
<NULL> 29.04.2008
<NULL> 30.04.2008
TeamA <NULL>
TeamB 30.04.2008
TeamC <NULL>

Aber auf jeden Fall fehlt kein Team - im Gegensatz zu "where ..."!
Daher ist zumindest die Aussage

Zitat:
es macht keinen Unterschied, ob die Bedingungen direkt im Join oder im Where gesetzt sind
widerlegt.

Gruß
Olli
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 3 von 3     123   


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:22 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz