L'Ă©volution de mes requĂȘtes SQL

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.








All Articles