![]() |
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:
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!!!
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; wär nett wenn ihr antwortet! martin |
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 |
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:
da kommt als ergebnismenge 1 zurück; ganz klar
select wertk
from testk where wertk = 1; und jetzt:
SQL-Code:
auf einmal bekomm ich 10 Einser-Werte
select wertk
from testk, testk where wertk = 1; kannst du mir mal schritt für schritt erklären, wie die anweisung abgearbeitet wird; ich blick's einfach nicht... danke, martin |
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.
|
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. |
Re: erklärt mir einer sql?
ich merk grad,
SQL-Code:
bezieht sich scheinbar nur auf die letzte der angegebenen ausgangstabellen, oder?
where wertk = 1;
hab das jetz nämlich nochmal abgewandelt in
SQL-Code:
nach meiner auffassung hätte da als ergbnis ja zurück kommen müssen:
select t1.wertk AS t1wk, t2.wertk AS t2wk
from testk t1, testk t2 where wertk = 1; 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... |
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 |
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; |
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:
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.
select *
from testk t1 join testk t2 on t1.wertk = t2.wertk where t1.wertk=1 |
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 15:57 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