Halo semuanya! Saya adalah Pimpinan Tim dan Pengembang Oracle Senior, saya telah bekerja dengan OeBS selama 12 tahun dan terutama menulis kueri SQL. Saya ingin memberi tahu Anda bagaimana pendekatan saya untuk menulis kueri SQL telah berubah selama ini.
Pada awalnya ada sebuah kata, atau lebih tepatnya permintaan. Katakanlah
select name from user where id = 1
Hampir tidak mungkin untuk menulis permintaan seperti itu. Ia bekerja sama baiknya di setiap database yang saya tahu. Dan saya hanya tahu oracle: W Tapi saya curiga di relasional lain juga, semuanya akan baik-baik saja.
Jadi apa yang terjadi? Masalah dimulai ketika ada dua tabel:
select name from user u, rest r where u.id = 1 and u.id = r.user_id
Kode ini memberi saya lebih banyak pertanyaan. Misalnya, bagaimana tabel-tabel ini digabungkan? Tampaknya ini lebih mudah id = user_id
, tetapi saya tidak menyukai sesuatu. Di klausa where, saya kehilangan pemisahan yang jelas antara kondisi filter dan tabel bergabung. Ketika query berisi 2 tabel, itu masih normal, tetapi ketika jumlah tabel mencapai 5, semuanya berantakan. Melihat kueri, saya tidak dapat segera memahami bagaimana tabel-tabel tersebut terhubung dan apakah beberapa tautan hilang. Dan semua orang hidup baik-baik saja dengannya, tetapi saya tidak bisa. Suatu hari, sebagai Juni muda, saya menemukan sintaks 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
di mana nilai-nilai yang berbeda hanya diganti dengan kekerasan dan apa serta bagaimana seharusnya nilai itu kembali dengan tangan. Sejak hari itu, saya telah menulis beberapa perkembangan, dan untuk masing-masingnya saya telah menyiapkan skrip pengujian saya sendiri. Saya sangat menyukai gaya ini dan sekarang saya mencoba menanamkannya di pengembang saya. Sehingga mereka tidak perlu melakukan perjalanan 12 tahun untuk menulis kueri SQL yang indah.
Akibatnya, hampir tidak ada hal baru yang terjadi di dunia SQL selama bertahun-tahun, namun, selalu menyenangkan menemukan peluang untuk meningkatkan kueri Anda.