みなさん、こんにちは!私はチームリーダーであり、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の世界では何年も新しいことがほとんど起こっていませんが、クエリを改善する機会を見つけることは常に素晴らしいことです。