![]() |
Datenbank: oracle • Zugriff über: egal
Suche Erklärung für SQL-Syntax
hallo zusammen,
bei einigen "Fremd"-Abfragen sind mir folgende Konstrukte über den Weg gelaufen, für die ich bisher keine vernünftige Erklärung gefunden habe:
SQL-Code:
wobei ich bisher nur für das "order by 1.." als Erklärung gefunden habe, die Zahlen bezögen sich auf das entsprechende Feld in der Select-Anweisung:
select 1 from ...
... where 1=1 and ..... order by 1,2 ...
SQL-Code:
entspricht
select Vorname, Nachname, Strasse ..
... order by 2,1
SQL-Code:
Könnt Ihr mir weiter helfen?
select Vorname, Nachname, Strasse ..
... order by Nachname, Vorname Gruß K-H |
Re: Suche Erklärung für SQL-Syntax
Code:
heißt das einfach eine Konstante selektiert wird. Damit könntest Du beispielsweise testen, ob die Verbindung zum DB-Server nicht abgebrochen ist.
SELECT 1 FROM table
Code:
Damit wird immer selektiert. Dies und auch das erste könnten darauf hindeuten, dass die Queries dynamisch aufgebaut sind, undzwar sodass diese ohne Restriktion (1 = 1) auch mit dem vordefinierten WHERE formuliert werden können. Aber das sind nur Vermutungen...
WHERE
1 = 1 |
Re: Suche Erklärung für SQL-Syntax
Hallo,
Zitat:
SQL-Code:
wird mir kein Record übergeben,
Select * From Personal
Where 1=1 aber die Feld-Namen der Tabelle. So könnte man also prüfen, ob bestimmte Felder in der Tabelle vorhanden sind. Heiko |
Re: Suche Erklärung für SQL-Syntax
Bei "WHERE 1=1" werden alle Datensätze übergeben.
Ich denke du meinst "WHERE 1=0" |
Re: Suche Erklärung für SQL-Syntax
Vielen Dank für die Antworten,
ich denke ich muß noch eine Erweiterung nachschieben:
SQL-Code:
in diesem Falle scheint es mir doch so, daß das "1=1" nur ein Überrest aus irgendeinem Reportgenerator oder ähnlichem ist, aber vollkommen überflüssig ist.
where 1=1
and Name='Meier' and .... Gruß K-H Nachtrag:
SQL-Code:
liefert bei mir "no rows selected" (Oracle)
select * from tabelle
where 1=0; |
Re: Suche Erklärung für SQL-Syntax
ich hab hier zwei, drei überlegungen...
1 - alles Richtig geklammert, das vergessen die Generatoren manchmal... 2 - kennst du die Quelle? vieleicht kann man da was drehen? 3 - bei automatisch generierten Report´s kanne ich alias mit a1, a2, b1,.... |
Re: Suche Erklärung für SQL-Syntax
Zitat:
|
Re: Suche Erklärung für SQL-Syntax
Zu dem 1=1 wurde genug gesagt, aber noch zu dem :
Zitat:
SQL-Code:
Aber nu, wat is dat ? :shock: Da kein ORDER BY angegeben ist, sortiert zumindest Firebird nach dem ersten Feld. 1 < 2, also kommt 1 zuerst in die Ergebnismenge und wird auch in Delphi vor dem 2-Krempel angezeigt. In der Praxis siehts nun so aus, dass es sich um Rabatte handelt. Artikel haben Priorität vor der eigenen Warengruppe. Soll das nun umgekehrt rum gemacht werden, dann kann man ohne Änderung an dem obigen SQL-Statement ORDER BY 2,1 dahinter schreiben. Schon ists umgedreht. Alternativ kann man auch für diesen Fall die 1 und 2 vertauschen.
SELECT 1,A.ID,A.NR AS NR,A.BEZ,A.BEZ2,R.WERT,R.VERGART
FROM ART8 A JOIN ARTRAB8 R ON A.ID = R.ID_ART WHERE R.ID_KUNDE = 516 UNION SELECT 2, W.ID,W.NR AS NR,W.BEZ AS BEZ,'',R.WERT,R.VERGART, FROM ART8 A,WG8 W JOIN WGRAB8 R ON W.ID = R.ID_WG WHERE R.ID_KUNDE = 516 Bevor die Frage kommt : was soll das '' denn da mittendrin ? UNION SELECT verlangt gleiche Anzahl Felder. Es geht allerdings in dem Fall um 2 unterschiedliche Tabellen. Art.Bez, und Art.Bez2 sind zwei Zeilen auf Bildschirm. Aber die Warengruppen haben nur ein Bez-Feld. Was tun ? Ich gaukle der Warengruppe ein zweites (leeres) Feld vor und fertig. :zwinker: Der Grund für dieses auf den ersten Blick etwas Undurchsichtige : Man kann zumindest in diesem speziellen Fall keine Feldnamen für ORDER BY angeben (zumindest gültig bis FB 2.1). Deshalb der Umweg über die Zahlen. |
Re: Suche Erklärung für SQL-Syntax
Die Ergänzung
SQL-Code:
in der Where-Klausel wird häufig vom Discoverer verwendet. Bei Oracle wird so die Nutzung des Optimizers erzwungen, vor allem, wenn keine Where-Klausel existiert.
1=1
Grüße Mikhal |
Re: Suche Erklärung für SQL-Syntax
Hallo,
SQL-Code:
hat einen charmanten Vorteil:
where 1=1
Du kannst alle SQL-Statments mit den erforderlichen Spalten und Tabellen ausformulieren und testen. Wenn nun zur Laufzeit die Wherebedingung geändert/ergänzt werden muss, hast Du in der Regel folgendes "Problem": Ist schon eine Wehrebedingung vorhanden, wenn nein fängst Du mit Where Spalte = Wert an und hängst weitere Bedingungen mit And an. Ist schon eine Wherebedingung vorhanden, so musst Du mit And anfangen. Hast Du nun alle Abfragen mit Where 1=1 versehen, brauchst Du Dir keine Gedanken über eine vorhandene oder nicht vorhandene Wehrebedingung machen, sondern kannst immer mit And Spalte=Wert arbeiten. Hierbei ist es dann vollkommen unerheblich, an wievielen Stellen, mit welchen Methoden eine Abfrage um eine Wherebedingung ergänzt wird. Mit And Spalte=Wert liegst Du hier immer richtig und musst das Abfragestatement letztlich nicht im Detail kennen und nicht selbst auf das Vorhandensein einer Wherebedingung überprüfen. Dies ist vor allem dann praktisch, wenn eine Abfrage bzw. deren Wherebedingung sich erst im Ablauf von einer Reihe unterschiedlicher Programmschritte ergibt. Gehen wir davon aus, dass Du eine großes Objekt mit vielen Details oder Wiederholgruppen hast, also eine klassische 1:n-Beziehung, so kannst Du einmal den entsprechenden Join formulieren und nachher im Objekt jedem Detail bzw. jeder Wiederholgruppe eine Methode "spendieren", die den entsprechenden Teil der Wherebedingung an die Abfrage anfügt, bzw. den "AND-Teil" der Wherebedingung für sich liefert. Das gut objektorientiert implementiert spart Dir dann viel Arbeit. Ein Methodenaufruf und schon ist die Abfrage um die objektspezifische Wherebedingung ergänzt. |
Re: Suche Erklärung für SQL-Syntax
Hallo,
Vielen Dank für die Antworten, Ich hab dann auch noch ein wenig ausprobiert:
SQL-Code:
Das ergibt dann:
select 1, tabdos.coddos akte,' '
from tabdos where tabdos.coddos like 'H 00%' union select 2, tabdos.coddos,tabbre.numdep from tabdos,tabbre where tabdos.idedos=tabbre.idedos and tabdos.coddos like 'H 00%' order by 2
Code:
ohne das "order by 2" wäre die Ausgabe wie Hansa sie beschrieben hat.1 AKTE '' ---------- --------------- --------------- 2 H 00997 59510209.3 2 H 00997 95908939.2 2 H 00997 95EP533 2 H 00997 P4405510.2 1 H 00998 2 H 00998 08/836162 2 H 00998 4439574.4 2 H 00998 515016/96 2 H 00998 95936561.0 2 H 00998 95EP4225 1 H 00999 1 AKTE '' ---------- --------------- --------------- 2 H 00999 08/687588 2 H 00999 4402851.2 Bei Oracle kann man allerdings die Feldnamen, des 1.Select für die Sortierung nutzen Gruß K-H |
Re: Suche Erklärung für SQL-Syntax
Das da verhält sich doch auch, wie beschrieben. Ich habe mich da wohl nicht genau genug ausgedrückt. Wenn in meinem Beispiel die Reihenfolge vertauscht werden soll, also die Daten aus der zweiten Tabelle sollen vor denen der ersten kommen, dann muss aus dem SELECT 1 -> SELECT 2 gemacht werden und umgekehrt. Dass das ORDER BY wegegelassen wird, das bewirkt lediglich, dass nach dem ersten Feld sortiert wird.
Bei Dir bewirkt dass ORDER BY 2, dass nach den H... Feldern sortiert wird. Mache mal da ORDER BY 4 rein. Du wirst sehen, dass z.B. der Datensatz mit dem P am Anfang zuletzt kommt. :shock: Ganz ohne ORDER BY werden die SELECT 1,.. - Felder vor den SELECT 2,.. Feldern stehen. Zusätzlich beginnen die zweiten Felder im SELECT alle mit H 00. Und das LIKE 'H 00%' würfelt die Ergebnismenge einfach so zusammen. ORDER BY 2 macht IMHO da keinen Sinn. |
Re: Suche Erklärung für SQL-Syntax
Zitat:
Zitat:
das ergibt Zitat:
Zitat:
Aber vielen Dank nochmals an alle, Es ist immer positiv wenn man solche Konstrukte versteht. Gruß K-H |
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:19 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