Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi erklärt mir einer sql? (https://www.delphipraxis.net/68003-erklaert-mir-einer-sql.html)

sancho1980 23. Apr 2006 00:54

Datenbank: interbase • Version: 6.5 • Zugriff über: ibx, ibexpert

erklärt mir einer sql?
 
hallo
ich habe hier ein sql-script, bei dem ich nicht ganz nachvollziehen kann, warum es tut, was es tut; wisst ihr da weiter?

so sieht es aus:

create table testk (
wertk integer not null primary key);
SQL-Code:
insert into testk (wertk) values (0);
insert into testk (wertk) values (1);
insert into testk (wertk) values (2);
insert into testk (wertk) values (3);
insert into testk (wertk) values (4);
insert into testk (wertk) values (5);
insert into testk (wertk) values (6);
insert into testk (wertk) values (7);
insert into testk (wertk) values (8);
insert into testk (wertk) values (9);

create table testg (
wertg integer not null primary key);

insert into testg
select k1.wertk * 10000 + k2.wertk * 1000 + k3.wertk * 100 + k4.wertk * 10 + k5.wertk
from testk k1, testk k2, testk k3, testk k4, testk k5;
warum da 10 werte von 0-9 in testk eingefügt werden ist mir ja noch klar, aber wie dann auf einmal in testg 100000 werte eingefügt werden, ist mir irgendwie schleihehaft!!!
wär nett wenn ihr antwortet!
martin

omata 23. Apr 2006 01:38

Re: erklärt mir einer sql?
 
Hallo sancho1980,

wenn man Tabellen durch Kommata und ohne weitere Verknüpfungsspalten miteinander verbindet, wird jetzt Zeile mit jeder Zeile verbunden. Da in deiner Tabelle 10 Zeilen sind, wird die erste Tabelle mit der zweiten verbunden. Also 10 * 10 = 100 Zeilen. Dann wird dieses Ergebnis mit der nächsten Tabelle verbunden. Also 100 * 10 = 1000.
Dann...
1000 * 10 = 10000,
10000 * 10 = 100000.

Deshalb bekommst du 100000 Zeilen.

MfG
Thorsten

sancho1980 23. Apr 2006 09:34

Re: erklärt mir einer sql?
 
hmmm
irgendwie ist mir das noch net klar, ehrlich gesagt
hab jetzt mal n bisschen mit rumgespielt, erklärs mir nochmal hieran bitte, vielleicht is das leichter
also zuerst:

SQL-Code:
select wertk
from testk
where wertk = 1;
da kommt als ergebnismenge 1 zurück; ganz klar

und jetzt:

SQL-Code:
select wertk
from testk, testk
where wertk = 1;
auf einmal bekomm ich 10 Einser-Werte

kannst du mir mal schritt für schritt erklären, wie die anweisung abgearbeitet wird; ich blick's einfach nicht...

danke,

martin

SirThornberry 23. Apr 2006 09:37

Re: erklärt mir einer sql?
 
du bekommst bei deinem Beispiel die Kreuzmenge weil du die tabellen nicht miteinander verknüpfst. Eine Verknüpfung ist im Sinne "where tabelle1.spalte1 = tabelle2.spalte1" gemeint.

alzaimar 23. Apr 2006 09:40

Re: erklärt mir einer sql?
 
SQL ist eine Abfragesprache, die die 'Tabellen' als Datenmengen (engl: Dataset) ansieht. Also befinden wir uns in der Mengenlehre. Der 'Select' - befehl liefert als eine Menge von einzelnen Datensätzen zurück. Gut.

Die Standardfunktionen auf Mengen sind 'Kreizprodukt', 'Schnittmenge' und 'Vereinigungsmenge'.

Zuerst wird die Ergebnismenge gebildet, indem alles bis zum 'WHERE' ausgeführt wird. Bei Dir ist das ein Kreuzprodukt aus der Tabelle 'testk' mit sich selbst. Du weisst, es sind 100 Zeilen. Anschließend werden dann nur die rausgefiltert, bei denen 'wertk=1' ist. Das ergibt dann die 10.

Ohne Verständnis von Mengenlehrer kommt man bei SQL nicht weit. Mit schon.

sancho1980 23. Apr 2006 10:03

Re: erklärt mir einer sql?
 
ich merk grad,
SQL-Code:
where wertk = 1;
bezieht sich scheinbar nur auf die letzte der angegebenen ausgangstabellen, oder?
hab das jetz nämlich nochmal abgewandelt in

SQL-Code:
select t1.wertk AS t1wk, t2.wertk AS t2wk
from testk t1, testk t2
where wertk = 1;
nach meiner auffassung hätte da als ergbnis ja zurück kommen müssen:

t1wk t2wk
1 1

stattdessen kommt raus

t1wk t2wk
0 1
1 1
2 1
3 1
4 1
5 1
6 1
7 1
8 1
9 1

das ding ist: bei "0 1" (allererste ergebniszeile) ist wertk von t1 ja gar nicht 1, sondern, ähm, 0 :P
dito für zeilen 3-10...

Flare 23. Apr 2006 10:08

Re: erklärt mir einer sql?
 
Aber wertk in t2wk ist immer 1 und die Abfrage heißt:
"Nehme alle Wertepaare, wo wertk = 1 ist."
Und das stimmt doch für alle.
Vielleicht solltest du einfach die Tabellenspalten umbenennen, falls das so nicht erwünscht ist :zwinker:


Flare

mkinzler 23. Apr 2006 10:11

Re: erklärt mir einer sql?
 
Du hast doch nur den Wertebereich vom "ertsten" testk (t1) eingeschränkt, dann wird dieser mit allen Werten vom 2. testk (t2) kombiniert.

Die Abfrage müßte

SQL-Code:
select
  t1.wertk AS t1wk, t2.wertk AS t2wk
from
  testk t1, testk t2
where
  t1.wertk = 1 and t2.wertk = 1;

alzaimar 23. Apr 2006 10:21

Re: erklärt mir einer sql?
 
Lies Dir nochmal durch, was ich geschrieben habe: Erst wird das Kreuzprodukt erstellt (100 Werte) und dann werden nur die ausgegeben, für die die Bedingung 'wertk=1' zutrifft. Das mySQL hier nicht meckert, ist natürlich verwirrend, denn eigentlich hätte es sagen müssen, das der Bezug zu 'wertk' nicht eindeutig ist. Offensichtlich wird einfach die letzte passende Tabelle verwendent. Wie grauslich!
Aber trotzdem werden dann genau die Datensätze geliefert, bei denen 'k2.wertk=1' ist.

Versuch doch mal eine Schnittmenge:
SQL-Code:
select * 
  from testk t1 
       join testk t2 on t1.wertk = t2.wertk
 where t1.wertk=1
Es wird die Schnittmenge aller Records mit gleichem 'wertk' gebildet (10 Stück) und dann nur das Record geliefert, bei dem in der zweiten Spalte eine '1' steht.

sancho1980 23. Apr 2006 10:44

Re: erklärt mir einer sql?
 
jo kapische
mir war halt schleierhaft, wie der sich einfach dazu erdreistet, wertk der 2. tabelle zu nehmen, wo doch wertk der 1. genauso zutreffend wäre;thx an alle


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