私のSQLクエリの進化

みなさん、こんにちは!私はチームリーダーであり、Oracle Developerのシニアです。OeBSで12年間働いており、主にSQLクエリを作成しています。この間に、SQLクエリを作成するための私のアプローチがどのように変化したかをお話ししたいと思います。





初めに、言葉、またはむしろ要求がありました。まあ言ってみれば





select name from user where id = 1
      
      



そのような要求を書くことはほとんど不可能です。それは私が知っているすべてのデータベースで等しくうまく機能します。そして、私はオラクルしか知りません:Wしかし、他のリレーショナルでも、すべてが大丈夫だと思います。





どうしたの?問題は、2つのテーブルがあったときに始まりました。





select name from user u, rest r where u.id = 1 and u.id = r.user_id
      
      



このコードは私にもっと質問をしました。たとえば、これらのテーブルはどのように結合する必要がありますか?簡単そうに見えますが  id = user_id



、気に入らなかったです。 where句で、フィルター条件とテーブル結合の明確な分離が欠落していました。クエリに2つのテーブルが含まれている場合でも正常でしたが、テーブルの数が5に達すると、すべてがバラバラになりました。クエリを見ると、テーブルがどのように接続されているか、リンクが欠落しているかどうかをすぐに理解できませんでした。そして、誰もがそれで元気に暮らしましたが、私はできませんでした。ある日、6月の若い頃、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



  さまざまな値がブルートフォースに置き換えられただけで、手で何をどのように戻す必要があるかがわかりました。その日以来、私はいくつかの開発を書き、それらのそれぞれについて、私はすでに独自のテストスクリプトを準備しました。私はこのスタイルが本当に好きで、今は開発者にそれを浸透させようとしています。そのため、美しいSQLクエリを作成するために12年を費やす必要はありません。





その結果、SQLの世界では何年も新しいことがほとんど起こっていませんが、クエリを改善する機会を見つけることは常に素晴らしいことです。








All Articles