AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi erklärt mir einer sql?
Thema durchsuchen
Ansicht
Themen-Optionen

erklärt mir einer sql?

Ein Thema von sancho1980 · begonnen am 23. Apr 2006 · letzter Beitrag vom 23. Apr 2006
Antwort Antwort
sancho1980

Registriert seit: 7. Feb 2006
429 Beiträge
 
#1

erklärt mir einer sql?

  Alt 23. Apr 2006, 00:54
Datenbank: interbase • Version: 6.5 • Zugriff über: ibx, ibexpert
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
Um Rekursion zu verstehen, muss man zunächst Rekursion verstehen.
  Mit Zitat antworten Zitat
omata

Registriert seit: 26. Aug 2004
Ort: Nebel auf Amrum
3.154 Beiträge
 
Delphi 7 Enterprise
 
#2

Re: erklärt mir einer sql?

  Alt 23. Apr 2006, 01:38
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
  Mit Zitat antworten Zitat
sancho1980

Registriert seit: 7. Feb 2006
429 Beiträge
 
#3

Re: erklärt mir einer sql?

  Alt 23. Apr 2006, 09:34
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
Um Rekursion zu verstehen, muss man zunächst Rekursion verstehen.
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#4

Re: erklärt mir einer sql?

  Alt 23. Apr 2006, 09:37
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.
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

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

Re: erklärt mir einer sql?

  Alt 23. Apr 2006, 09:40
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.
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
sancho1980

Registriert seit: 7. Feb 2006
429 Beiträge
 
#6

Re: erklärt mir einer sql?

  Alt 23. Apr 2006, 10:03
ich merk grad, 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
dito für zeilen 3-10...
Um Rekursion zu verstehen, muss man zunächst Rekursion verstehen.
  Mit Zitat antworten Zitat
Flare

Registriert seit: 26. Jan 2006
Ort: Leipzig
529 Beiträge
 
Delphi 7 Professional
 
#7

Re: erklärt mir einer sql?

  Alt 23. Apr 2006, 10:08
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


Flare
Willy Scheibel
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#8

Re: erklärt mir einer sql?

  Alt 23. Apr 2006, 10:11
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;
Markus Kinzler
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

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

Re: erklärt mir einer sql?

  Alt 23. Apr 2006, 10:21
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.
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
sancho1980

Registriert seit: 7. Feb 2006
429 Beiträge
 
#10

Re: erklärt mir einer sql?

  Alt 23. Apr 2006, 10:44
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
Um Rekursion zu verstehen, muss man zunächst Rekursion verstehen.
  Mit Zitat antworten Zitat
Antwort Antwort


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 16:25 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