Bonjour Ă tous! Je suis Team Lead et Senior Oracle Developer, je travaille avec OeBS depuis 12 ans et j'Ă©cris principalement des requĂȘtes SQL. Je voudrais vous dire comment mon approche de l'Ă©criture de requĂȘtes SQL a changĂ© pendant cette pĂ©riode.
Au dĂ©but, il y avait un mot, ou plutĂŽt une requĂȘte. Disons
select name from user where id = 1
Il est presque impossible d'écrire une telle demande. Cela fonctionne aussi bien dans toutes les bases de données que je connais. Et je ne connais qu'oracle: W Mais je soupçonne que dans d'autres relations aussi, tout ira bien.
Alors, qu'est-ce-qu'il s'est passé? Les problÚmes ont commencé quand il y avait deux tables:
select name from user u, rest r where u.id = 1 and u.id = r.user_id
Ce code m'a donnĂ© plus de questions. Par exemple, comment ces tables doivent-elles ĂȘtre jointes? Il semblerait que ce soit plus facile id = user_id
, mais je nâai pas aimĂ© quelque chose. Dans la clause where, il me manquait une sĂ©paration claire entre les conditions de filtre et les jointures de table. Lorsque la requĂȘte contenait 2 tables, c'Ă©tait encore normal, mais lorsque le nombre de tables atteignait 5, tout s'effondra. En regardant la requĂȘte, je ne pouvais pas comprendre immĂ©diatement comment les tables Ă©taient connectĂ©es et s'il manquait un lien. Et tout le monde a bien vĂ©cu avec ça, mais je ne pouvais pas. Un jour, en tant que jeune June, je suis tombĂ© sur la syntaxe ANSI.
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
dans lequel diffĂ©rentes valeurs ont simplement Ă©tĂ© remplacĂ©es par la force brute et quoi et comment il devrait revenir avec les mains regardĂ©. Depuis ce jour, j'ai Ă©crit plusieurs dĂ©veloppements, et pour chacun d'eux j'ai dĂ©jĂ prĂ©parĂ© mon propre script de test. J'ai vraiment aimĂ© ce style et maintenant j'essaye de l'instiller chez mes dĂ©veloppeurs. Pour qu'ils n'aient pas Ă voyager 12 ans pour Ă©crire de belles requĂȘtes SQL.
En consĂ©quence, presque rien de nouveau ne s'est produit dans le monde SQL depuis de nombreuses annĂ©es, cependant, il est toujours agrĂ©able de trouver des opportunitĂ©s pour amĂ©liorer vos requĂȘtes.