Autor |
Beitrag |
Kossy
      
Beiträge: 53
|
Verfasst: Di 01.05.12 17:57
Hallo !
Ich hab nochmal eine Frage zum Thema SQL.
Innerhalb der FROM Klausel kann ich sämtliche Tabellen meiner Datenbank miteinander "Joinen" und somit eine neue Tabellenstruktur aufbauen, die quasi meine Datenbasis unter eben den "JOIN Bedingungen" darstellt.
Ich bin mir jetzt nicht sicher, ob ich alles richtig verstanden habe, aber kann ich in der SELECT Klausel dann frei bestimmen, welche Felder ich aus den jetzt neu geformten Inhalten der FROM Klausel ausgeben möchte? Und können selbst die Felder, die ich nicht in der SELECT Klausel ausgeben möchte, dann innerhlab der WHERE- oder einer möglichen HAVING Klausel ohne Probleme weitergenutzt werden?
Viele Grüße
--Kossy--
|
|
Horschdware
      
Beiträge: 744
Erhaltene Danke: 54
Win XP Pro, Win 7 Pro x64
Delphi 7, Delphi XE, C++ Builder 5, SAP R/3
|
Verfasst: Mi 02.05.12 10:18
Hallo,
du kannst die projezierten Felder aus dem Verbund frei wählen.
SQL-Anweisung 1: 2: 3:
| SELECT A.Artikelnummer A.Beschreibung B.Preis FROM A INNER JOIN B ON A.Artikelnummer = B.Artikelnummer WHERE B.Farbe = 'rot' |
In der WHERE-Bedingung können dabei auch Felder genutzt werden, die nicht in der Projektion landen.
Für eine HAVING Klasuel müssen jedoch die betroffenen Felder per Aggregatsfunktion in der Auswahl landen, sonst gibt es ja nichts, auf das sich das HAVING beziehen könnte.
SQL-Anweisung 1: 2: 3:
| SELECT Artikel.Artikelnummer SUM( Lager.Bestand ) FROM Artikel LEFT OUTER JOIN Lager ON Artikel.Artikelnummer = Lager.Artikelnummer HAVING Lager.Bestand > 100 |
Moderiert von Th69: Code- durch SQL-Tags ersetzt
_________________ Delphi: XE - OS: Windows 7 Professional x64
|
|
Kossy 
      
Beiträge: 53
|
Verfasst: Mi 02.05.12 10:34
Vielen Dank für die Erläuterung !!
Moderiert von Th69: Full-Quote entfernt.
|
|
Kossy 
      
Beiträge: 53
|
Verfasst: Do 03.05.12 12:49
Hallo nochmal !
Ich habe nochmal eine Frage zu diesem Thema, genauergesagt geht es um die GroupBy Klausel. Wenn ich in der GroupBy Klausel Felder aus der datenbasis der FROM Klausel angebe, nach denen ich gruppieren möchte und vielleicht 2 Aggregatfunktionen einbaue, die auf diese Gruppierungen angewendet werden sollen, MUSS ich immer zwingend alle Felder, auf die die diese Gruppierungen die Aggregatfunktionen angewandt werden, immer vollständig innerhlab der SELECT Klausel ausgeben, oder kann ich da auch nach Bedarf welche auslassen?
Aber wenn ich es jetzt richtig verstanden habe, dann muss ich diejenigen Felder, die dann in der SELECT Klausel auftauchen, auch innerhalb einer möglichen HAVING Klausel verwenden, richtig?
Viele Grüße
--Kossy--
|
|
Kossy 
      
Beiträge: 53
|
Verfasst: Fr 04.05.12 06:54
Hallo nochmal !
Mag wirklich niemand auf meine letzte Frage antworten?
|
|
Horschdware
      
Beiträge: 744
Erhaltene Danke: 54
Win XP Pro, Win 7 Pro x64
Delphi 7, Delphi XE, C++ Builder 5, SAP R/3
|
Verfasst: Fr 04.05.12 09:06
Hallo,
zu deinen Fragen:
Zitat: | (muss man alle Felder) immer vollständig innerhlab der SELECT Klausel ausgeben, oder kann ich da auch nach Bedarf welche auslassen? |
SQL-Anweisung 1: 2: 3: 4:
| SELECT COUNT(Vorlesung.PersNr) AS Anzahl, Professor.Name FROM Professor LEFT OUTER JOIN Vorlesung ON Professor.PersNr = Vorlesung.PersNr GROUP BY Professor.PersNr; | ->geht
Zitat: | Aber wenn ich es jetzt richtig verstanden habe, dann muss ich diejenigen Felder, die dann in der SELECT Klausel auftauchen, auch innerhalb einer möglichen HAVING Klausel verwenden, richtig? |
HAVING ist eine weitere optionale Einschränkung, die sich auf die verdichteten Werte aus der GROUP BY Klausel bezieht.
Moderiert von Th69: Code- durch SQL-Tags ersetzt
_________________ Delphi: XE - OS: Windows 7 Professional x64
|
|
Ralf Jansen
      
Beiträge: 4708
Erhaltene Danke: 991
VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
|
Verfasst: Fr 04.05.12 11:09
In welcher DB? Nach meinem dafür halten ist das unzulässig und sollte knallen auch wenn Professor.Name eindeutig einer PersNr zuzuordnen ist.
|
|
Th69
      

Beiträge: 4798
Erhaltene Danke: 1059
Win10
C#, C++ (VS 2017/19/22)
|
Verfasst: Fr 04.05.12 11:27
Hallo Ralf,
ich stimme dir hier zu - sollte so direkt nicht funktionieren (zumindestens bei den üblichen Datenbanksystemen).
Als Trick nutze ich dann immer
SQL-Anweisung 1: 2: 3:
| SELECT ..., Professor.Name ... GROUP BY Professor.PersNr, Professor.Name; |
|
|
|