Hallo, alle miteinander! Ich bin Teamleiter und leitender Oracle-Entwickler. Ich arbeite seit 12 Jahren mit OeBS und schreibe hauptsächlich SQL-Abfragen. Ich möchte Ihnen sagen, wie sich mein Ansatz zum Schreiben von SQL-Abfragen in dieser Zeit geändert hat.
Am Anfang gab es ein Wort oder eher eine Bitte. Sagen wir
select name from user where id = 1
Es ist fast unmöglich, eine solche Anfrage zu schreiben. Es funktioniert in jeder mir bekannten Datenbank gleich gut. Und ich kenne nur Orakel: W Aber ich vermute, dass auch in anderen Beziehungen alles in Ordnung sein wird.
Also was ist passiert? Die Probleme begannen, als es zwei Tische gab:
select name from user u, rest r where u.id = 1 and u.id = r.user_id
Dieser Code gab mir weitere Fragen. Wie sollen diese Tabellen beispielsweise verbunden werden? Es scheint einfacher zu sein id = user_id
, aber mir hat etwas nicht gefallen. In der where-Klausel fehlte mir eine klare Trennung zwischen Filterbedingungen und Tabellenverknüpfungen. Wenn die Abfrage 2 Tabellen enthielt, war dies noch normal, aber als die Anzahl der Tabellen 5 erreichte, fiel alles auseinander. Als ich mir die Abfrage ansah, konnte ich nicht sofort verstehen, wie die Tabellen verbunden waren und ob ein Link fehlte. Und alle lebten gut damit, aber ich konnte nicht. Als junger Juni stieß ich eines Tages auf die ANSI-Syntax.
select name from user inner join rest on u.id = r.user_id where u.id = 1
, , SQL . , - . . SQL. - . . ANSI , .
select u.name, r.resp_name
from user u
left join resp r on u.id = r.user_id and r.end_date > sysdate
where id = 1
, . , , . . . with.
select resp_q as (
select resp_name, userid
from resp where r.end_date > sysdate)
,main_q as (
select u.name, r.respname
from user u
left join resp_q r on u.id = r.userid
where id = 1)
select * from main_q
, with “”, . : “ . . . , .” . WET, .. , . , . from . , , with , hint MATERIALIZE. . . , .. + . , , 10 , with.
- . , , , - . , . unit , . . 100, 120. ? … , , , . ( ).
select * from document where xxstorno(id) = 'Y'
10 . , - . , . . , , , . , 5-7 , .
with test_case as (
select 10 id, 'Y' storno from dual
union all
select 5 id, 'N' storno from dual)
, run_test as (
select tc.id, decode(xxstorno(d.id), tc.storno, 'OK', 'Error') result
from test_case tc
left join document d on d.id = tc.id)
select * from run_test
, - , . , . , ! , . , . and id = 5--6 7 10 135 1345
in denen verschiedene Werte einfach durch rohe Gewalt ersetzt wurden und was und wie es mit den Händen zurückkehren sollte. Seit diesem Tag habe ich mehrere Entwicklungen geschrieben und für jede habe ich bereits mein eigenes Testskript vorbereitet. Dieser Stil hat mir sehr gut gefallen und jetzt versuche ich, ihn meinen Entwicklern zu vermitteln. Damit sie nicht 12 Jahre reisen müssen, um schöne SQL-Abfragen zu schreiben.
Infolgedessen passiert in der SQL-Welt seit vielen Jahren fast nichts Neues. Es ist jedoch immer schön, Möglichkeiten zu finden, um Ihre Abfragen zu verbessern.