Oracle
 sql >> Teknologi Basis Data >  >> RDS >> Oracle

Perbedaan antara WITH klausa dan subquery?

WITH klausa untuk pemfaktoran subquery, juga dikenal sebagai ekspresi tabel umum atau CTE:

Klausa WITH query_name memungkinkan Anda menetapkan nama ke blok subquery. Anda kemudian dapat mereferensikan blok subquery ke beberapa tempat dalam kueri dengan menentukan query_name. Oracle Database mengoptimalkan kueri dengan memperlakukan nama kueri sebagai tampilan sebaris atau sebagai tabel sementara.

Dalam contoh kedua Anda, apa yang Anda sebut temp_table adalah tampilan inline, bukan tabel sementara.

Dalam banyak kasus, pilihan yang akan digunakan tergantung pada gaya yang Anda sukai, dan CTE dapat membuat kode lebih mudah dibaca terutama dengan berbagai tingkat subkueri (tentu saja pendapat berbeda-beda). Jika Anda hanya merujuk ke tampilan CTE/inline sekali, Anda mungkin tidak akan melihat perbedaan kinerja apa pun, dan pengoptimal mungkin berakhir dengan paket yang sama.

Mereka sangat berguna meskipun ketika Anda perlu menggunakan subquery yang sama di lebih dari satu tempat, seperti di serikat pekerja. Anda dapat menarik tampilan sebaris ke dalam CTE sehingga kode tidak diulang, dan memungkinkan pengoptimal untuk mewujudkannya jika dianggap bermanfaat.

Misalnya, contoh yang dibuat-buat ini:

select curr from (
  select curr from tableone t1
  left join tabletwo t2 on (t1.empid = t2.empid)
) temp_table
where curr >= 0
union all
select -1 * curr from (
  select curr from tableone t1
  left join tabletwo t2 on (t1.empid = t2.empid)
) temp_table
where curr < 0

dapat difaktorkan ulang menjadi:

with temp_table as (
  select curr from tableone t1
  left join tabletwo t2 on (t1.empid = t2.empid)
)
select curr from temp_table
where curr >= 0
union all
select -1 * curr from temp_table
where curr < 0

Subquery tidak lagi harus diulang. Semakin rumit kode yang diulang, semakin menguntungkan dari sudut pandang pemeliharaan untuk menggunakan CTE. Dan semakin mahal subkueri, semakin banyak manfaat kinerja yang bisa lihat dari menggunakan CTE, meskipun pengoptimal biasanya cukup baik dalam mengetahui apa yang Anda lakukan.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Konversikan baris baru ke XML di dalam Oracle Trigger

  2. Apa perbedaan antara AS dan IS dalam prosedur tersimpan Oracle?

  3. Mencoba menyebarkan aplikasi Oracle-ADF ke Tomcat 7

  4. NCHR() Fungsi di Oracle

  5. LISTAGG di Oracle untuk mengembalikan nilai yang berbeda