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

Pengidentifikasi tidak valid dalam kueri bersarang ganda dengan ORDER BY dan ROWNUM

Dalam subkueri skalar yang Anda gunakan, Anda hanya dapat mereferensikan tabel dari kueri "utama" "satu tingkat bersarang ke bawah", tidak lebih jauh ke bawah, seperti yang telah Anda lihat. (Saya yakin pembatasan ini dicabut di versi 12, jadi mungkin Anda bisa mengupgrade database Anda?;-)

Di subquery skalar Anda mencoba mendapatkan nilai kolom INSERTDATE dari baris pertama sesuai dengan pemesanan Anda. Itu juga dapat ditulis tanpa bersarang sebagai berikut:

SELECT
O.INSERTDATE OrderCreateDate,

-- Determine delivery date
(SELECT MAX(DD.INSERTDATE) KEEP (
          DENSE_RANK FIRST ORDER BY
          DD.CLOSED ASC, ABS(TRUNC(CURRENT_DATE-TO_DATE(TO_CHAR(DD.INSERTDATE, 'DDMMYYYY'), 'DDMMYYYY'))) ASC
        )
   FROM MY_DELIVERYDATE_TABLE DD
   JOIN MY_ORDERPOS_TABLE OP2 ON DD.FK_ORDERPOS=OP2.ID
   LEFT OUTER JOIN MY_ORDER_TABLE O2 ON OP2.FK_ORDER=O2.ID
   WHERE OP2.FK_ORDER=O.ID AND -- This will no longer give "Invalid identifier O.ID"
         DD.DELFLAG IS NULL AND OP2.DELFLAG IS NULL
) DeliveryDate

FROM MY_ORDER_TABLE O
WHERE O.ID = 620; -- ID goes here!

KEEP (DENSE_RANK FIRST memberi tahu fungsi MAX, bahwa ia harus menghitung MAX hanya dari baris-baris yang menempati peringkat pertama dalam klausa ORDER BY. Jadi jika ORDER BY Anda "unik", MAX hanya akan diterapkan ke satu baris. Jika ORDER BY Anda tidak "unik" dan dapat memiliki duplikat, Anda dapat memikirkan apakah Anda menginginkan MAX atau MIN (atau menambahkan sesuatu ke ORDER BY untuk membuatnya unik.)

(Jika Anda menggunakan Oracle versi 12, alternatif KEEP (trik DENSE_RANK adalah menggunakan klausa HANYA 1 ROW PERTAMA dari pernyataan SELECT.)




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Penyedia Oracle OLE DB tidak Terdaftar di SSIS

  2. Apakah ODP.NET diperlukan untuk Oracle 11g Client?

  3. Tidak dapat memuat jenis 'NHibernate.ByteCode.Castle.ProxyFactoryFactory, NHibernate.ByteCode.Castle'

  4. Mengekstrak data secara otomatis - Oracle SQL Developer

  5. Bagaimana Cara Memasukkan File di Database Oracle?